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