问题描述:
八皇后问题是十九世纪著名数学家高斯于1850年提出的。问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上。
代码如下:
1 #include <iostream> 2 #include <cstdlib> 3 #include <string> 4 5 using namespace std; 6 7 int queen[1024]; 8 int sum; 9 /** 10 *八皇后问题 经典递归解法 11 */ 12 // 打印皇后 13 void printQ(int n) { 14 for (int i = 0; i < n; i++) { 15 for (int j = 0; j < n; j++) { 16 if (queen[i] == j) { 17 cout << "Q "; 18 } 19 else { 20 cout << "* "; 21 } 22 } 23 cout << endl; 24 } 25 26 } 27 // 判断第i行皇后是否合适 28 bool isValid(int i) { 29 bool res = true; 30 for (int j = 0; j < i; j++) { 31 if (queen[j] == queen[i] || abs(queen[i] - queen[j]) == i - j) { 32 res = false; 33 break; 34 } 35 } 36 return res; 37 } 38 // 放置皇后,表示把第i行的皇后放在第j列 39 void placeQueen(int i,int queenCnt) { 40 if (i == queenCnt) { 41 cout << "第 " << sum + 1 << " 组的解为:" << endl; 42 sum++; 43 printQ(queenCnt); 44 return; 45 } 46 for (int j = 0; j < queenCnt; j++) { 47 queen[i] = j; 48 // 如果第i行皇后放在第j列合法,则放下一行 49 if (isValid(i)){ 50 placeQueen(i + 1, queenCnt); 51 } 52 } 53 } 54 55 int main() 56 { 57 unsigned int queenCnt; 58 cout << "请输入皇后的个数:"; 59 cin >> queenCnt; 60 placeQueen(0, queenCnt); 61 cout << "一共 " << sum << " 解!" << endl; 62 system("pause"); 63 return 0; 64 }
只为训练自己,时刻锤炼一个程序员最基本的技能!