全排列

問題描述:全排列:給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字符串中的字母已經按照從小到大的順序排列。
作者:學長
時間:2017年5月23日
輸入:輸入只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在1到6之間。
輸出:輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。字母序如下定義:

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

代碼學習心得:使用遞歸和循環依次訪問數組內元素,在遞歸遞和歸的過程中實現數組元素訪問的打表,爲毛我就沒想出來這樣的代碼

代碼:

/*
問題描述:全排列:給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字符串中的字母已經按照從小到大的順序排列。
作者:學長
時間:2017年5月23日
輸入:輸入只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在1到6之間。
輸出:輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。字母序如下定義:
已知S = s1s2...sk , T = t1t2...tk,則S < T 等價於,存在p (1 <= p <= k),使得 s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。
*/
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char str[7];
void f(int x)
{
if(x==strlen(str))
{
cout<<str<<endl;
return ;
}
for(int j=x;j<strlen(str);j++)
{
swap(str[j],str[x]);
f(x+1);
swap(str[j],str[x]);
}
}
bool vis[7];//記錄是否訪問過
char t[7];//該數組用於存儲將要輸出的全排列結果
/*void f(int x)
{
    if(x==strlen(str))
    {
        cout<<t<<endl;
        return ;
    }
    for(int i=0; i<strlen(str); i++)
    {
        if(vis[i])
        {
            t[x]=str[i];
            vis[i]=false;//表示該位置被訪問過
            f(x+1);
            vis[i]=true;//將遞歸結束,將對應位置的訪問記錄重初始化爲true
        }
    }
}*/
int main()
{
    cin>>str;
    memset(vis,true,7*sizeof(bool));//初始化vis數組,將其所有值初始化爲true
    f(0);
    return 0;
}
程序運行結果展示:

知識點總結:遞歸和循環

學習心得:大神級的代碼。。

發佈了302 篇原創文章 · 獲贊 43 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章