题目大意:有一个N*N的棋盘,要在上面放N个皇后。为了不让她们互相攻击,每一竖列、横列、斜列,都只能有一个皇后。求有多少种摆法,并打出每一种摆法。(如果你想知道详细题目——去问度娘)
样例:
input:4
output :
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0
2
分析:其实这道题很简单,就是一道DFS模板题。首先读入数据,然后DFS第一排枚举N个格子,再枚举第二排,直到第N排。每放一个皇后都要进行一次判断,是否与其它皇后冲突,直到放完N个皇后。好,废话不多说,下面我们来看代码(注意为了方便大家理解程序,这不一定是最简单的方法):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int f[20][20],ans,n;
//判断是否可放皇后的函数
int kf(int x,int y){
int i=x,j=y;
while (i>0 && j>0){ //判断左上方有没有皇后
i--; j--;
if (f[i][j]) return 0;//一但找到皇后,就返回0
}
i=x; j=y;
while (i>0){ //判断上方有没有皇后
i--;
if (f[i][j]) return 0;
}
i=x; j=y;
while (i>0 && j<=n){ //判断右上方有没有皇后
i--; j++;
if (f[i][j]) return 0;
}
return 1;
}
//输出函数
void out(){
int i,j;
for (i=1;i<=n;i++){
for (j=1;j<=n;j++)
printf("%d ",f[i][j]);//打出每一格的状态
puts("");
}
puts(""); ans++;//方案数加1
}
//深搜函数
void dfs(int i){
int j;
for (j=1;j<=n;j++)//枚举每一个位置
if (kf(i,j)){
f[i][j]=1;//"放皇后"
if (i==n) out();//判断达标,输出
else dfs(i+1);//继续搜索
f[i][j]=0;//回朔
}
}
int main(){
scanf("%d",&n);
dfs(1); //从第1行开始摆皇后
printf("%d\n",ans);//搜完打出总方案数
system("pause>nul");
return 0;
}