全排列


題目描述】
給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。

我們假設對於小寫字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且給定的字符串中的字母已經按照從小到大的順序排列。


【輸入】
只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在1到6之間。

【輸出】
輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。字母序如下定義:

已知S=s1s2...sk,T=t1t2...tkS=s1s2...sk,T=t1t2...tk,則S<T等價於,存在p(1≤p≤k),使得s1=t1,s2=t2,...,sp−1=tp−1,sp<tps1=t1,s2=t2,...,sp−1=tp−1,sp<tp成立。


【輸入樣例】
abc
【輸出樣例】
abc
acb
bac
bca
cab
cba
#include <bits/stdc++.h>

using namespace std;
bool vis[15];
char str[15],temp[15];
int n;

void dfs(int s)
{
    if(s==n)       //判斷是否可以輸出字符串
    {
        temp[s]='\0';
        cout<<temp<<endl;
    }

    for(int i=0;i<n;i++)    //循環,第一層循環有三個,每個循環會有新的dfs遞歸,又會產生循環(符合循環條件的只有兩個),依次循環遞歸下來到最后一個dfs就直接打印輸出字符串
    {
       if(vis[i]==0)
       {
           vis[i]=1;   //用字母
           temp[s]=str[i];
           dfs(s+1);
           vis[i]=0;
       }
    }
}
int main()
{
    cin>>str;
    n=strlen(str);
    dfs(0);     //調用dfs函數
    return 0;
}

dfs、回溯搜索;

遞歸到最大深處就打印,打印完了就返回上一層的for循環繼續填充下一個字母,循環結束繼續返回上一層;就像回溯搜索一樣,把數據存儲下來,一步步走完后回退到上一個數據繼續走完;

vis表示字母用沒用過,用過就不會保存在temp數組中,沒用過會用,dfs完了之后會置零表示沒用過;

emmmmmdfs過程大概就如下吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM