N皇后问题

本文介绍了如何利用深度优先搜索(DFS)算法和一维数组来解决N皇后问题,通过递归的方式避免重复并检查列和对角线冲突,最后输出所有可能的解决方案数量。
摘要由CSDN通过智能技术生成

n皇后问题

在N*N(N<=10)的棋盘上放置N个皇后,使得他们不能相互攻击。两个皇后能相互攻击当且仅当他们在同一行,或者同一列,或者同一对角线上。

dfs基本格式

#include<iostream>
using namespace std;
void dfs(int x){//层数
    if(达到目的) 输出(或者方案数+1)
    else{
    	for(遍历所有的算符){
    		if(没有用到){
    			标记
    			dfs(x+1)//下一层递归
    			回溯
    		}
    	}
    }
}

在这道题目中,“层数”可以等于“行”,即第x层递归可以等价于第x行,那么只需要检验对角线以及列数。又因为行数已经可以忽略不考虑(一定符合条件),我们可以用一维数组(p[11])存放皇后.

1.检验列,只需判断p[j]是否与已经放入的“皇后”位置不同,即p[j]!=i;

2.检验对角线,只需要判断“皇后”的行列之差(的绝对值)是否相等

#include<bits/stdc++.h>
using namespace std;
int n,ans,p[11];//一维数组p用来记录列 

void Nqueen(int x){ 
	if(x==n+1){//边界条件 即此时已经找完 计算方案数 
		ans++;
		return;//返回函数 
	}
	else{
		for(int i=1;i<=n;i++){
			bool ok=true;
			for(int j=1;j<x;j++){//检查第x列之前 
				if((p[j]==i)||(abs(x-j)==abs(i-p[j]))){//第一部分判断皇后是否在同一列 第二部分判断是否在同一对角线 
					ok =false;
					break;
				}
			}
			if(ok){
				p[x]=i;//放入 
				Nqueen(x+1);//下一列 
				p[x]=0;
			}
		}
	}
}

int main(){
	cin>>n;
	Nqueen(1);//从第一行找起 
	cout<<ans;
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值