RosettaCodeData/Task/N-queens-problem/Stata/n-queens-problem-3.stata
2018-06-22 20:57:24 +00:00

37 lines
608 B
Text

mata
real matrix queens_rec(real scalar n) {
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) {
real scalar j, k
if (i > n) {
m = m\a
} else {
for (j = i; j <= n; j++) {
k = a[j]
p = i-k+n
q = i+k-1
if (u[p] & v[q]) {
u[p] = v[q] = 0
a[j] = a[i]
a[i] = k
queens_aux(n, i+1, a, u, v, m)
u[p] = v[q] = 1
a[i] = a[j]
a[j] = k
}
}
}
}
end