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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是BFSDFS算法的C++模板: BFS算法模板: ```cpp #include <iostream> #include <queue> using namespace std; void BFS(int start, int end) { queue<int> q; bool visited[n]; // 标记节点是否被访问过 int level[n]; // 记录节点的层级 // 初始化visited和level数组 for (int i = 0; i < n; i++) { visited[i = false; level[i = 0; } q.push(start); visited[start = true; while (!q.empty()) { int current = q.front(); q.pop(); // 进行当前节点的操作 for (int neighbor : 获取当前节点的所有邻居节点) { if (!visited = true; level = level[current + 1; } } } // 输出结果,例如输出最短路径的长度 cout << "最短路径长度为:" << level[end << endl; } ``` DFS算法模板: ```cpp #include <iostream> using namespace std; void DFS(int current, bool visited[]) { // 进行当前节点的操作 visited[current = true; // 标记当前节点已访问 for (int neighbor : 获取当前节点的所有邻居节点) { if (!visited = false; } DFS(start, visited); return 0; } ``` 这些模板可以用于解决各种问题,如迷宫、八皇后、n皇后、油田、连通块、数独等。在使用时,根据具体问题的要求选择适合的算法,并按照注释部分进行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [DFSBFS理解+模板+例题](https://blog.csdn.net/weixin_43876357/article/details/112552683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值