#include <iostream> #include <math.h> #include <stdlib.h> using namespace std; const int N = 8; //把第n个皇后放在l列上是否冲突,隐含条件:第n个皇后肯定放在第n行上 bool test(int board[N][N], int n, int l) { int i, j; for (i = 0; i < N; i++) if (board[n][i] == 1 || board[i][l] == 1) return false; //board[n][l]的对角线成员 for (i = 0; i < N; i++) for (j = 0; j < N; j++) if ((n - l) == (i - j) || (i + j == n + l)) if (board[i][j] == 1) return false; return true; } void put(int board[N][N], int n, int l) { board[n][l] = 1; } void show(int board[N][N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) cout << board[i][j] << ' '; cout << endl; } cout << endl; } void solve(int board[N][N], int n) { int i, j; static int count = 0; if (n == N) { count++; cout << "以下是第" << count << "种可行放法" << endl; show(board); return; } for (i = 0; i < N; i++) { if (test(board, n, i)) { put(board, n, i); solve(board, n + 1); board[n][i] = 0; //backtrace } } } int main() { int board[N][N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) board[i][j] = 0; } solve(board, 0); return 0; }