CS153/hw6/hw4programs/sp22_tests/nqueens.oat

55 lines
1.2 KiB
Text
Raw Normal View History

global n = 4;
int n_queens(int row, int state) {
if (row >= n) {
for (var i = 0; i < n; i = i + 1; ) {
var cur = state >> 4 * i [&] 15;
for (var j = 0; j < n; j = j + 1; ) {
if (cur == j) {
print_string("*");
} else {
print_string("-");
}
}
print_string("\n");
}
print_string("\n");
return 1;
}
var total = 0;
for (var i = 0; i < n; i = i + 1; ) {
var ok = true;
for (var j = 1; j <= row; j = j + 1; ) {
var cur = state >> 4 * (j - 1) [&] 15;
if (cur == i | cur == i - j | cur == i + j) {
ok = false;
j = row;
}
}
if (ok) {
total = total + n_queens(row + 1, state << 4 [|] i);
}
}
return total;
}
int atoi(string s) {
var ret = 0;
var arr = array_of_string(s);
for (var i = 0; i < arr[-1]; i = i + 1; ) {
ret = ret * 10 + arr[i] - 48;
}
return ret;
}
int program(int argc, string[] argv) {
if (argc >= 2) {
n = atoi(argv[1]);
}
print_int(n_queens(0, 0));
return 0;
}