// Sort of non-deterministic #include #include using namespace std; void print(int board[], int size) { for (int r = 0; r < size; r += 1) { for (int c = 0; c < size; c += 1) if (board[r] == c) cout << "X"; else cout << "-"; cout << "\n"; } cout << "\n"; } void put_queens(int board[], int size) { bool * col_used = new bool[size]; bool * plus_diag_used = new bool[2 * size - 1]; bool * minus_diag_used = new bool[2 * size - 1]; while (true) { memset(col_used, 0, size * sizeof(bool)); memset(plus_diag_used, 0, (2 * size - 1) * sizeof(bool)); memset(minus_diag_used, 0, (2 * size - 1) * sizeof(bool)); for (int r = 0; r < size; r += 1) { cout << "row " << r << "\n"; while (true) { int c = random() % size; cout << " r = " << r << ", c = " << c << ": "; if (col_used[c]) { cout << "reject, column used\n"; continue; } if (plus_diag_used[r + c]) { cout << "reject, plus diagonal used\n"; continue; } if (minus_diag_used[r - c + size - 1]) { cout << "reject, minus diagonal used\n"; continue; } cout << "accept\n"; board[r] = c; col_used[c] = true; plus_diag_used[r + c] = true; minus_diag_used[r - c + size - 1] = true; break; } } print(board, size); return; } } int main(int argc, char * argv[]) { int size = 8; if (argc > 1) { char * c; size = strtol(argv[1], & c, 10); if (* c != '\0' || size < 1) { cerr << argv[1] << " is not a usable number\n"; exit(1); } } srandomdev(); int * board = new int[size]; put_queens(board, size); delete [] board; }