//N皇后
#include<iostream>
using namespace std;
int n = 8, vis1[8]/*标记列*/, vis2[16]/*标记左上到右下(i-j+4)*/, vis3[16]/*标记左下到右上(i+j)*/;
int a[8][8];
int ans = 0;
void vis(int i, int j, bool flag) {//标记函数
a[i][j] = flag;
vis1[j] = flag;
vis2[i - j + n] = flag;
vis3[i + j] = flag;
}
void dfs(int i)//针对当前行
{
if (i == n) {//搜满打印
printf("NO.%d\n", ++ans);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
printf("%d ", a[i][j]);
printf("\n");
}
}
for (int j = 0; j < n; j++) {//搜列
if (!vis1[j] && !vis2[i - j + n] & !vis3[i + j]) {
vis(i, j, 1);
dfs(i + 1);
vis(i, j, 0);
}
}
}
int main()
{
dfs(0);
return 0;
}
输出(举例)
NO.1
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
NO.2
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
NO.3
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
......