著名的N皇后问题,就是先按照行一行一行的找,先找第一行,第一行找到一列能满足条件,继续找下一行,如果下一行也找到一列能满足条件,继续找下一行,一次类推,最终找到解, 但是,如果找不到的话, 就说明上一行放的位置错误, 所以回溯到上一行中,继续找下一列,如果找不到,继续回溯,大体就是这么执行找到解的。
下面是代码:
#include <stdio.h> const int MAX = ;
int n;
int a[MAX];//保存当前列值
int vis1[MAX];//标记当前列
int vis2[MAX];//标记副对角线
int vis3[MAX];//标记主对角线
int cnt;
void dfs(int cur)
{
if(cur == n)//如果找完了,打印出来
{
for(int i = ; i < n; i++)
printf("%d ", a[i]);
printf("\n");
cnt++;
return;
}
int i = cur + ;//此时是按照行来找的,所以直接遍历列就行
for(int j = ; j <= n; j++)
{
//如果列,主对角线,副对角线都满足条件,就能放
if(vis1[j] == && vis2[i + j] == && vis3[i - j + ] == )
{
//标记
vis1[j] = ;
vis2[i + j] = ;
vis3[i - j + ] = ;
//如果满足条件,就将当前的列值给到a数组中
a[cur] = j;
//找下一列
dfs(cur + );
//取消标记,
vis1[j] = ;
vis2[i + j] = ;
vis3[i - j + ] = ;
} }
}
int main()
{
while(~scanf("%d", &n))
{
cnt = ;
dfs();
printf("%d\n", cnt);//统计总数
}
return ;
}