weinan030416

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

深度优先搜索dfs解决排列问题

N皇后问题

复制代码
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int N;
vector<int> res;
void dfs(int n)
{
    if(n==N)//一种情况结束输出结果 
    {
        for(int i=0;i<N;i++)        cout<<res[i];
        cout<<endl;
        return;
    }
    
    for(int i=1;i<=N;i++)
    {
        int k;
        for(k=0;k<n;k++)
        {
            if(res[k]==i||abs(res[k]-i)==abs(n-k))//皇后会相互攻击 
            {
                break;
            }
        }
        
        if(k==n)//位置合理 
        {
            res[n]=i;
            dfs(n+1);//下一个位置 
        }
    }
}
int main()
{
    cin>>N;
    res.resize(N);//初始化 
    dfs(0);
    return 0; 
}
复制代码

字符全排列问题

复制代码
#include<iostream>
#include<string.h>
using namespace std;

char n[10],path[10],used[10];
void dfs(int t)
{
    if(t==strlen(n))//一种情况结束输出结果 
    {
        for(int i=0;i<strlen(n);i++)
        {
            cout<<path[i];
        }
        cout<<endl;
        return;
    }    
    
    for(int i=0;i<strlen(n);i++)
    {
        if(!used[i])//没有被用过,排除重复排列 
        {
            path[t]=n[i];
            used[i]=true;
            dfs(t+1);
            used[i]=false;
        }
    }
}

int main()
{
    cin>>n;
    dfs(0); 
}
复制代码

 可以重复使用字母

复制代码
#include<iostream>
#include<cstring>
using namespace std;

char path[10];
char t[10];

void dfs(int n,int l)
{
    if(n==l)
    {
        n=0;
        cout<<path<<endl;
        return;
    }
    
    for(int i=0;i<l;i++)
    {
        path[n]=t[i];
        dfs(n+1,l);
    }
}

int main()
{

    cin>>t;
    dfs(0,strlen(t));
}
复制代码

 

posted on   楠030416  阅读(14)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示