递归:全排列与n皇后

输出全排列利用递归实现
每一层递归排列好一个数字,抵达边界就输出

#include <cstdio>

using namespace std;
int n,P[11],hashTable[11]={false};
void generateP(int index)
{
    if(index == n+1)//抵达边界,开始输出
    {
        for(int i=1;i<=n;i++)
            printf("%d",P[i]);
        printf("\n");
        return;
    }
    for(int x=1;x<=n;x++)
    {
        if(hashTable[x]==false)//hashTable 判断第x位是否已经有数字排列好了
        {
            P[index]=x;
            hashTable[x]=true;
            generateP(index+1);//排列下一个位置
            hashTable[x]=false;
        }
    }
}
int main()
{
    n = 3;
    generateP(1);
    return 0;
}


n皇后问题可以理解为全排列的一种问题,不过要加上判断,不能在同一对角线

#include <cstdio>

using namespace std;
int n,P[11],hashTable[11]={false};
void generateP(int index)
{
    if(index == n+1)//抵达边界,开始输出
    {
        bool flag = true;
        for(int i =1;i<=n;i++)
        {
            for(int j =i+1;j<=n;j++)
                if(abs(i-j)==abs(p[i]-p[j]))
                flag=false;
        }
          if(flag)
        cou++;
        return;
    }
    for(int x=1;x<=n;x++)
    {
        if(hashTable[x]==false)//hashTable 判断第x位是否已经有数字排列好了
        {
            P[index]=x;
            hashTable[x]=true;
            generateP(index+1);//排列下一个位置
            hashTable[x]=false;
        }
    }
}

利用回溯法进行优化,提前判断后续是否可行

void generateP(int index)
{
    if(index == n+1)
    {
        return;//抵达此处必定合法
    }
    for(int x=1;x<=n;x++)
    {
        if(hashTable[x]==false)
        {
            bool flag = true;
            for(int pre = 1;pre < index;pre++)
            {
                if(abs(i-j)==abs(p[i]-p[j]))
                {
                    flag=false;break;
                }
            }
            if(flag){
            P[index]=x;
            hashTable[x]=true;
            generateP(index+1);//排列下一个位置
            hashTable[x]=false;
            }

        }
    }
}
发布了21 篇原创文章 · 获赞 0 · 访问量 392

猜你喜欢

转载自blog.csdn.net/weixin_41605876/article/details/104639252
今日推荐