N皇后问题(超详细c++代码)

问题:N皇后问题是指在N*N的棋盘上摆放N个皇后,使得任意两个皇后都不在同一行、同一列或者同一斜线上,求满足这种摆放的解为多少个

解题思路:

(1)定义判断函数:                                                                                                                      判断是否可以放置皇后: 不同行(第几个皇后已经表示第几行了,不用判断);不同列(即将放置的皇后与之前所有皇后所在列不同);不同斜线(即将放置的皇后与之前所有皇后练成线的斜率不为±1)


(2)定义递归的回溯函数,并调用判断函数:
若在该行遍历完n之前能够找到位置放置皇后,则向下一行递归,若没有位置,则向上回溯。如果棋盘所有行列寻找完毕,则解的个数+1

 c++代码如下:

//N皇后问题
#include<bits/stdc++.h>
int n;
int ans;
int x[15];//x[a]=b表示第a个皇后在第a行,第b列 
using namespace std;
int PD(int a){//对放置的第a个皇后进行判断是否可以放置
	for(int i=1;i<a;i++){
		if(abs(x[i]-x[a])==abs(i-a)){
			return 0;//如果在同一斜线就返回0 
		}
		else if(x[i]==x[a]){
			return 0;//如果在同一列就返回0 
		}
	} 
	//如果以上都没有就返回1
	return 1; 
} 
//深度优先搜索
void DFS(int a){//对第a个皇后进行放置 
	if(a>n){
		ans++;//检查是否放置了第n个皇后,如果已经放了n个皇后就ans加1
		return;
	}
	else{
		for(int i=1;i<=n;i++){//对第a行,1到n列 全部进行放置 
			x[a]=i;
			if(PD(a)){//如果可以放置就对下一个皇后进行放置 
				DFS(a+1);
			}
			else{//不能放就看下一列 
				continue;
			} 
		}
	}
} 
int main(){
	cin>>n;
	DFS(1);//从第一个皇后开始放置 
	cout<<ans<<endl;
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值