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;
} 
*/