//八皇后问题
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100], b[100], c[100], d[100];
/*数组 a b c d 分别记录某点所对应的横、纵、斜(\ and /)是否可以放棋子,
是否可以放取决于标记数组*/
int total = 0;//总放置方法
int n;// n*n 棋盘
int print() {//打印前三组数据
if (total <= 2) {
for (int k = 1;k <= n;k++) cout << a[k] << " ";
cout << endl;
}
total++;//暗中实现记录总个数的目的!
}
void queen(int i) {
if (i > n) {//遍历了所有行表示得到了一个答案
print();
return;//表示该层递归的结束
}
else {
for (int j = 1;j <= n;j++) {
if ((!b[j]) && (!c[i + j]) && (!d[i - j + n])) {
a[i] = j;b[j] = 1;
c[i + j] = 1;d[i - j + n] = 1;
//在 i 行的 j 位置放置一个棋子,则该点对应的横纵斜被标记,不可再放棋子
queen(i + 1);
//如果走入死胡同,则取消标记退一步,换一条路尝试:
b[j] = 0;
c[i + j] = 0;
d[i - j + n] = 0;
//再补充:这里的换一条路是在第 i 行的基础上尝试下一个可能的列(j),如果所有的列都走不通则回溯行(i)
}
}
}
}
int main() {
cin >> n;
queen(1);
cout << total;
return 0;
}
/*总结
1.关于 i 行的标记问题:我们考虑问题时是按照逐行分析的方法,每一行从左向右遍历,在标记时只需要标记对应
的横与斜
2.理解深度优先搜索的思维方法是难点*/
(开始写题解了,不求多,越详细越好,主要是辅助自己理解问题!)