日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全排列算法解析(视频+详解+代码+STL)

發布時間:2024/8/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全排列算法解析(视频+详解+代码+STL) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

全排列生成算法

剛開始自學的時候搜了兩三個scdn中關于講解全排列問題的博客,但是我理解能力比較差還是沒有完全理解

,后來就在網上搜索了視頻才完全弄懂,現在把我理解的分享給你們。

學習視頻:http://v.ku6.com/show/RP7r6vew4Qb_MCF1eYZeOg...html

1、? 沒有重復字符的全排列問題

例如:對abcd進行全排列

如圖:

分析:a b c d

1、? 定a 對b c d進行全排列?

2、? 定 b對a c d進行全排列

3、? 定c 對a b d進行全排列

4、? 定d 對a b c進行全排列

很明顯這個涉及到遞歸的思想,

#include<iostream> #include<cstring> using namespace std; char str[]="abcd"; void permitation(int from,int to) {if(from==to)//相當于a->d后就輸出{for(int i=0;i<=to;i++){cout<<str[i];//輸出其中一種排列的情況}cout<<endl;return;//遞歸出口,結束當前遞歸,以便對接下來的進行全排列}for(int i=from;i<=to;i++){swap(str[i],str[from]);//讓首字母與其中的某個字符進行交換操作,例如上文中對的分析abcd的全排列中,//開始首字母是a,接下來是b,然后是c最后是d,這就涉及到swap操作,第一次因為from=0,i=0,自己交換自己之后就真正的交換permitation(from+1,to);swap(str[i],str[from]);//做完之后再交換回來,保證維系原來abcd的順序,以便下一次進行全排列} } int main(){int size=strlen(str);//獲得字符串長度permitation(0,size-1);return 0; }

2、? 出現重復字符的全排列問題

例如:1223

1-223

2-123

3-221

帶重復字符的全排列就是每個字符分別與它后面非重復重現字符的進行交換

即:第i個字符與第j個字符交換時,要求[I,j)中沒有與第j個字符相等的數出現

代碼:(知識加了一個判斷條件)

/*無重復字符情況的全排列問題*/

#include<iostream> #include<cstring> #include<algorithm> using namespacestd; char str[1000]; int isSwap(intfrom,int to) {bool flag=true;for(int i=from;i<to;i++){if(str[to]==str[i]){flag=false;break;}}return flag; } voidpermitation(int from,int to) {if(from==to)//相當于a->d后就輸出{for(int i=0;i<=to;i++){cout<<str[i];//輸出其中一種排列的情況}cout<<endl; return;//遞歸出口,結束當前遞歸,以便對接下來的進行全排列}for(int i=from;i<=to;i++){if(!isSwap(from,i))continue;swap(str[i],str[from]);//讓首字母與其中的某個字符進行交換操作,例如上文中對的分析abcd的全排列中,//開始首字母是a,接下來是b,然后是c最后是d,這就涉及到swap操作,第一次因為from=0,i=0,自己交換自己之后就真正的交換permitation(from+1,to);swap(str[i],str[from]);//做完之后再交換回來,保證維系原來abcd的順序,以便下一次進行全排列} } int main(){while(1){printf("Please input astring:");cin>>str;sort(str,str+strlen(str));intsize=strlen(str);//獲得字符串長度permitation(0,size-1);}return 0; }

3、? 知道原理之后下次用的時候可以直接利用STL中的庫函數來做,庫函數不用考慮是否有重復字符出現特別方便

代碼:

?

#include<iostream> #include<cstring> #include<algorithm> using namespacestd; char str[1000]; int main(){while(1){printf("Please input astring:");cin>>str;sort(str,str+strlen(str));//從stl庫中調用全排列的庫函數do{for(inti=0;i<strlen(str);i++){cout<<str[i]<<"";}cout<<endl;}while(next_permutation(str,str+strlen(str)));}return 0; }

總結

以上是生活随笔為你收集整理的全排列算法解析(视频+详解+代码+STL)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。