dfs/bfs--N皇后问题

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
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
#include

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=0&&b>=0;a--,b--){
		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

 

你可能感兴趣的:(算法相关)