首页 > 代码库 > 八皇后问题

八皇后问题

问题描述:

八皇后问题是十九世纪著名数学家高斯于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 }

 

八皇后问题