DFS实现全排列


dfs递归写全排列是真的让我头大,看了好长时间!总结一下吧,免得忘记!

写法一:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int vis[10];//用于标记是否被访问过,0--未访问  1--已访问
int ans[10];//用于存储答案
int n;

void dfs(int step)
{
    for(int i = 1; i <= n; i++)
    {
        if(vis[i] == 0)
        {
            vis[i] = 1;
            ans[step] = i;//将答案存储

            if(step < n) //调用递归
                dfs(step + 1); //即相当于再一次从头执行一个dfs函数,可以理解为一个嵌套
            else
            {
                for(int i = 1; i <= n; i++){
                    
                    printf("%d",ans[i]);
                    
                    if(i != n)  //用于控制输出格式
                        printf(" ");
                    else
                        printf("\n");
                }
            }
            vis[i] = 0; //访问完毕返回标记为可访问
                        //只有当输出了一个结果后才有可能执行
        }
    }
}

int main()
{

    while(~scanf("%d",&n))
    {
        memset(vis, 0, sizeof(vis));
        dfs(1);
    }

    return 0;
}

 

写法二:

#include<bits/stdc++.h>
using namespace std;

int n;
int step;
int vis[105];
int a[105];

void dfs(int step)
{
    if(step == n + 1)
    {
        for(int i = 1; i <= n; i++)
        {
            printf("%d",a[i]);
            if(i != n)
                printf("*");
            else
            {
                printf("\n");
            }
        }
    }

    for(int i = 1 ; i <= n; i++)
    {
        if(vis[i] == 0)
        {
            vis[i] = 1;
            a[step] = i;
            dfs(step + 1);
            vis[i] = 0;
        }
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        memset(vis, 0 ,sizeof(vis));
        step = 0;
        dfs(1);
    }
    return 0;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM