N皇后问题
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 92 10
我用深搜时间超时,所以我直接水题了
#include<stdio.h>
int main(){
int p[10]={1,0,0,2,10,4,40,92,352,724};
int n;
while(1){
scanf("%d",&n);
if(n==0)
break;
printf("%d\n",p[n-1]);
}
return 0;
}
/*
* 时间超时了
*/
/*
* 演示:
* k = 1,N = 1: 0 --> 1
*
* k = 2,N = 2: 0 0 -->no
* 0 0
*
* k = 3,N = 3: 0 0 0 -->no
* 0 0 0
* 0 0 0
*
* k = 4,N = 4: 0 0 0 0 --> 0 1 0 0 0 0 1 0
* 0 0 0 0 0 0 0 1 1 0 0 0
* 0 0 0 0 1 0 0 0 0 0 0 1
* 0 0 0 0 0 0 1 0 0 1 0 0
*/
/*#include<stdio.h>
#include<string.h>
int flag[10][10]; //用于标记放过的棋子
int number; //表示棋子个数
int count ; //用来记录有多少种方式
*/
//int iscorrect(int i , int j ){ //判断是否可以放置棋子
/*
* -------->
* |0 0 0 0
* |0 0 a 0
* |0 0 0 0
* |0 0 0 0
* |
*
* 假设现在要判断a是否可以放置棋子 a(1,2)
*
* 判断左上方时 a=0,b=1; -->(0,1)
* 判断右上方时 a=0,b=3; -->(0,3)
* 判断左下方时 a=2,b=1; -->(2,1),(3,0)
* 判断右下方时 a=2,b=3; -->(2,3)
*/
/* int a,b;
for(a=i,b=0;b<number;b++){
if(flag[a][b]==1) //判断同一行是否有棋子
return 0;
}
for(a=0,b=j;a<number;a++){
if(flag[a][b]==1) //判断同一列中是否有棋子
return 0;
}
for(a=i-1,b=j-1;a>=0&&b>=0;a--,b--){
if(flag[a][b]==1) //判断左上方否有棋子
return 0;
}
for(a=i-1,b=j+1;a>=0&&b<number;a--,b++){
if(flag[a][b]==1) //判断右上方否有棋子
return 0;
}
for(a=i+1,b=j-1;a<number&&b>=0;a++,b--){
if(flag[a][b]==1) //判断左下方否有棋子
return 0;
}
for(a=i+1,b=j+1;a<number&&b<number;a++,b++){
if(flag[a][b]==1) //判断右下方否有棋子
return 0;
}
return 1;
} */
/*void dfsQ(int i){
int j;//i代表行数 ,j代表列数
if(i==number){
//棋盘是(number-1)*(number-1)的模式,
count++;
return ;
} else{
for(j=0;j<number;j++){
if(iscorrect(i,j)){//如果可以放置棋子
flag[i][j]=1; //标记flag[i][j]
dfsQ(i+1); //递归调用
flag[i][j]=0; //消除标记
}
}
}
return ;
}*/
/*
* 演示: dfsQ(0),number = 2 10
/ | 00
iscorrect(0,0)=1 flag[0][1]
flag[0][0]=1;
dfsQ(1)
/
return
*/
/*
int main(){
while(1){
//初始化
count = 0;
scanf("%d",&number);
if(number==0)
break;
memset(flag,0,sizeof(flag));
dfsQ(0);
printf("%d\n",count);
}
return 0;
}
*/