#include <iostream>
using namespace std;
//int search(int k) {// k是第几个
//
// for (int i = 1; i <= 算符总数; i++) {
// if (满足条件) {
// //保存计算结果
// if (到了目的地) {
// //输出解
// }
// else {
// search(k + 1);// 查找下一个
// }
// //恢复状态,保存结果之前的状态(回溯一步)
// }
// }
//}
int s = 0;
int b[9] = { 0 }; //判断a的列是否会重复
int a[9]; // a[i] = k 表示第i行在k列
int c[17] = { 0 }; //特征数组 左下--->右上
int d[17] = { 0 };
void search(int k) {
for (int i = 1; i <= 8; i++) {
//b[i] == 0 表示列可以放 ; c[i + k] == 0 表示坐下--->右上可以放 ;
//d[i - k + 7] == 0 表示 左上-->右下可以方
if ((b[i] == 0) && c[i + k] == 0 && d[i - k + 7] == 0) {
a[k] = i; //放置皇后
b[i] = 1; //此列已经选过
c[k + i] = 1; //占据对角线
d[i - k + 7] = 1; //
if (k == 8) {
//放置了最后一个,就是叶子节点
s++;
for (int m = 1; m <= 8; m++) {
cout << a[m]; //所有解
}
cout << endl;
}
else {
search(k + 1);
}
b[i] = 0; //回复列
c[k + i] = 0; //恢复对角线
d[i - k + 7] = 0; //
}
}
}
int main() {
search(1);
cout << s;
}