71 lines
1.6 KiB
C++
71 lines
1.6 KiB
C++
#include<bits/stdc++.h>
|
||
using namespace std;
|
||
|
||
//超详细讲解: https://www.cnblogs.com/cnnnnnn/p/8506883.html
|
||
|
||
//8皇后问题
|
||
#define line 8
|
||
|
||
void queen(int i, int j);
|
||
int check(int i, int j);
|
||
//棋盘
|
||
int chess[line][line];
|
||
|
||
//方法总数
|
||
int cas = 0;
|
||
|
||
|
||
int main() {
|
||
//开始尝试
|
||
queen(0, 0);
|
||
printf("%d\n", cas);
|
||
return 0;
|
||
}
|
||
|
||
//皇后的递归主函数
|
||
void queen(int i, int j) {
|
||
if (j >= line) {
|
||
return;
|
||
}
|
||
if (check(i, j) == 1) {//如果能放
|
||
chess[i][j] = 1;//放皇后
|
||
if (i == line - 1) {//如果是最后一行,记录情况
|
||
cas++;
|
||
/*下面是输出每种棋盘结果,供测试*/
|
||
for (int xx=0;xx<8;xx++)
|
||
for(int yy=0;yy<8;yy++){
|
||
printf("%d",chess[xx][yy]);
|
||
if(yy==7)
|
||
printf("\n");
|
||
}
|
||
printf("\n");
|
||
/*上面是输出结果*/
|
||
}
|
||
else {
|
||
queen(i + 1, 0);//不是最后一行就分析下一行
|
||
}
|
||
}
|
||
//重点代码!!!
|
||
chess[i][j] = 0;//如果此位置不能放,就置空(0),判断旁边的格子。
|
||
//如果此位置能放,走到这里就意味着上面的代码全部执行了,把皇后拿走(置零),再讨论其他情况,拿旁边位置试探。
|
||
queen(i, j + 1);
|
||
}
|
||
|
||
//判断是不是在指定位置放皇后
|
||
int check(int i, int j) {
|
||
int k;
|
||
for (k = 0; k < line; k++) {
|
||
if (chess[i][k] == 1) return 0;//0=不能放
|
||
}
|
||
for (k = 0; k < line; k++) {
|
||
if (chess[k][j] == 1) return 0;
|
||
}
|
||
for (k = -line; k <= line; k++) {//两对角线
|
||
if (i + k >= 0 && i + k < line && j + k >= 0 && j + k < line)//从左上到右下对角线
|
||
if (chess[i + k][j + k] == 1) return 0;
|
||
if (i - k >= 0 && i - k < line && j + k >= 0 && j + k < line)//从左下到右上对角线
|
||
if (chess[i - k][j + k] == 1) return 0;
|
||
}
|
||
return 1;
|
||
}
|