N皇后问题:
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 int N; 6 int queenPos[100];//用来存放算好的皇后位置。最左上角是(0,0) 7 8 void NQueen(int k); 9 10 int main() 11 { 12 cin >> N; 13 NQueen(0); //从第0行开始摆皇后 14 return 0; 15 } 16 void NQueen(int k) //在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后 17 { 18 int i; 19 if (k == N) // N 个皇后已经摆好 20 { 21 for (i = 0; i < N; i++) 22 cout << queenPos[i] + 1 << " "; 23 cout << endl; 24 return; 25 } 26 for (i = 0; i < N; i++)//逐一尝试第k个皇后所在的列i. 27 { 28 int j; 29 for (j = 0; j < k; j++) 30 { 31 //和已经摆好的 k个皇后的位置比较,看是否冲突 32 //queenPos[j] == i表示第j个皇后所在的列queenPos[j]与第k个皇后所在的列i相等 33 //abs(queenPos[j] - i) == abs(k-j)表示第k个皇后和第j个皇后在同一个斜线(行之差与列之差绝对值相等) 34 if (queenPos[j] == i || abs(queenPos[j] - i) == abs(k - j)) 35 { 36 break; //冲突,则试下一个位置 37 } 38 } 39 if (j == k) //当前选的位置 i 不冲突 40 { 41 queenPos[k] = i; //将第k个皇后摆放在第i列 42 NQueen(k + 1); 43 } 44 } //for( i = 0;i < N;i ++ ) 45 }
2N皇后:
#include<iostream> #include<math.h> using namespace std; #define N 100 int wq[N]; //whitequeen,黑皇后位置 int bq[N]; //blackqueen,白皇后位置 int cb[N][N]; //chessboard,棋盘 int num; //皇后数目 int count = 0; //不同放置情况计数 int bqueen(int pos) //黑色皇后放置 { int i; for (i = 0; i < pos - 1; i++) { int judge = bq[i] - bq[pos - 1]; if (0 == judge || abs(judge) == abs(pos - 1 - i)) return 0; } if (pos == num) { ::count++; return 0; } for (int i = 0; i < num; i++) { if (i != wq[pos] && cb[pos][i]) { bq[pos] = i; bqueen(pos + 1); } } } int wqueen(int pos) //白色皇后放置 { int i; for (i = 0; i < pos - 1; i++)//处理之前置入的皇后,判断是否冲突,冲突就返回,同时貌似放在这边还能使递归能返回,很巧妙,博主我只是搬运 { int judge = wq[i] - wq[pos - 1]; if (0 == judge || abs(judge) == abs(pos - 1 - i )) return 0; } //当前的pos意为已经有pos个放好了,这次函数在处理pos+1的调用 if (pos == num)//放满了才会调用 { bqueen(0); return 0; } for (int i = 0; i < num; i++) { if (cb[pos][i])//该位置是否能放,能放的话,每一个都试一下,如果不行,会返回0----当前不判断的是否能放,由N+1 //来查看N次是否能放,不能放就会返回0 { wq[pos] = i; wqueen(pos + 1); } } } int main() { cin >> num; for (int i = 0; i < num; i++) for (int j = 0; j < num; j++) cin >> cb[i][j]; wqueen(0);//先白后黑 cout << ::count; return 0; }