N-Empress

全排列

基本思想:递归、散列#

代码实现#

#include<cstdio>
const int maxn = 11;
int n, P[maxn], 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)
        {
            P[index] = x;
            hashTable[x] = true;
            generateP(index + 1);  /*递归式*/
            hashTable[x] = false;  /*还原状态*/
        }
    }
}
int main()
{
    n = 4;
    generateP(1);
    return 0;
}

N皇后问题

描述#

在n*n的国际象棋棋盘上放置n个皇后,他们不能在同一行,同一列以及同一条对角线上。任意给出一个n,求合法方案数。

基本思想:全排列#

每一列上的皇后的行号是n的全排列数,再检测对角线。

代码实现#

基础递归#

int count = 0;
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; break;}
        }
        if(flag) count++;
        return ;
    }
    for(int x = 1; x <= n; x++)
    {
        if(hashTable[x] == flase)
        {
            hashTable[x] = true;
            P[index] = x;
            generateP(index + 1);
            hashTable[x] = false;
        }
    }
}

回溯递归#

在递归之前先判断是否需要进行的递归

int count = 0;
void generateP(int index)
{
    if(index == n+1)
    {
        count ++;
        return ;
    }
    for(int x = 1; x <= n; x++)
    {
        if(hashTable[x] == false)
        {
            bool flag = true;
            /*遍历之前皇后*/
            for(int pre = 1; pre < index; pre++)
            {
                /*同对角线*/
               if(abs(index - pre) == abs(x - P[pre]))
                {flag = false; break; } 
            }
            if(flag)
            {
                P[index] = x;
                hashTable[x] = true;
                generateP(index+1);
                hashTable[x] = false;
            }
        }
    }
}
posted @   咪啪魔女  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示