给出的一个值N即代表棋盘的大小,又表示皇后的数量。。读题不细心,这么一个简单的问题也迷惑了半天。。。
既然行数,列数,皇后的个数都相等,那么用一个一维数组就可以表示相应的棋盘啦!数组的下标表示行,对应的值表示列!且第x个皇后就只能放在第x行!
还有一点:需要打表!!测试数据有多组,到0才结束,所以要将十种情况例举出来,避免超时!
#include<cstdio>
int map[15],a[15],x,n,num;
void dfs(int x){
int i,j,sign;
if(x==n+1)
num++;//跳出函数。。。不太懂
else{
for(i=1;i<=n;i++){
sign=1;
map[x]=i;//假设第x个皇后放在第x行第i列
for(j=1;j<x;j++){//判断前x-1行,不能等于!!
if(map[x]==map[j]||(map[x]-x==map[j]-j)||(map[x]+x==map[j]+j)){
sign=0;
break;//如果冲突,则跳出去判断下一列
}
}
if(sign)//如果不冲突,该假设成立,进行下一个皇后的判断
dfs(x+1);
}
}
}
void bow(){//打表函数
for(n=1;n<=10;n++){//一定要用n!!
num=0;//可能的情况
dfs(1);//从1开始
a[n]=num;
}
}
int main(){
bow();
while(scanf("%d",&n),n)
printf("%d\n",a[n]);
return 0;
}