4.3节全排列(递归理解)n皇后问题

本文详细解析了全排列的实现算法,通过递归方式生成全排列,并以N皇后问题为例,展示如何利用全排列避免皇后在同一行或列冲突。深入理解全排列在解决复杂问题中的应用。

在考虑全排列时,要想到根据1.2.3…的顺序这样输出这个全排列,初始index(理解index为第几个位置)为1,且hash均为false,当index为1,for循环此时停在i=1这个点往下递归过去(第一级递归),同理index为2,i=2(第二级递归),在index为4时输出这个p数组,return返回上一级递归(第三级递归)的循环式里,当上一级(第三级递归)循环时index为3,i=3,hash[3]再次设置为了false,此时应该出循环返回上一级递归(第二级递归),上一级递归式(第二级递归)中index为2,i=2,结束该函数时,hash[2]又再次设置为了false,此时i++,i值更新为3,因为hash[3]是false,所以就进循环里了,那么当前的p[index]更新为3;也就是说当前位置(index为2),放的数字是3,接下来继续递归,index为3,p[index]为2;得到1 3 2这个排列数,之后返回第三级递归,循环过后,hash[2]=false;返回第二级递归,因为第二级递归i=3,所以只有hash[3]=false,返回第一级递归,此时第一级递归式,i=1;(只手动模拟了一级的,之后的递归式也是类似)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,p[11];
bool hashnum[11]={false};
void generateP(int index)
{
	if (index==n+1)
	{
		for (int i=1;i<=n;i++)
		printf("%d ",p[i]);
		return;
	}
    for (int i=1;i<=n;i++)
    {
    	if (hashnum[i]==false)
    	{
    		p[index]=i;
    		hashnum[i]=true;
    		generateP(index+1);
    		hashnum[i]=false;
		}
	}	
}
int main()
{
    n=3;
    generateP(1);
    return 0;
}

n皇后问题是在全排列基础上解决的,虽然看起来n皇后是2维的,但是理解起来,我们可以假设,n皇后每个都有编号(1~n)他们去坐凳子(1-n),假如每个皇后都坐在自己编号的位置,那么那么相当于a【i】【i】,二维数组里的对角线形式,所以可以看成全排列,这样就避免皇后坐在棋盘中的同一行或列了,每个凳子(行)只可以坐一个编号(列)的皇后,这样我们只用考察皇后是否在同对角线就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值