RosettaCodeData/Task/N-queens-problem/Stata/n-queens-problem-3.stata

38 lines
608 B
Text
Raw Permalink Normal View History

2017-09-23 10:01:46 +02:00
mata
2018-06-22 20:57:24 +00:00
real matrix queens_rec(real scalar n) {
2017-09-23 10:01:46 +02:00
real rowvector a, u, v
real matrix m
a = 1..n
u = J(1, 2*n-1, 1)
v = J(1, 2*n-1, 1)
m = J(0, n, .)
queens_aux(n, 1, a, u, v, m)
return(m)
}
void queens_aux(real scalar n, real scalar i, real rowvector a,
real rowvector u, real rowvector v, real matrix m) {
2018-06-22 20:57:24 +00:00
real scalar j, k
2017-09-23 10:01:46 +02:00
if (i > n) {
m = m\a
} else {
2018-06-22 20:57:24 +00:00
for (j = i; j <= n; j++) {
k = a[j]
p = i-k+n
q = i+k-1
2017-09-23 10:01:46 +02:00
if (u[p] & v[q]) {
u[p] = v[q] = 0
2018-06-22 20:57:24 +00:00
a[j] = a[i]
a[i] = k
2017-09-23 10:01:46 +02:00
queens_aux(n, i+1, a, u, v, m)
u[p] = v[q] = 1
2018-06-22 20:57:24 +00:00
a[i] = a[j]
a[j] = k
2017-09-23 10:01:46 +02:00
}
}
}
}
end