国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

全排列的兩種解法(dfs和STL)

2019-11-11 04:31:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

首先寫簡(jiǎn)單的那種、用STL模板里有一個(gè)神奇的函數(shù)叫做next_permutation(a,a+n)返回值為bool型,用來(lái)判斷還有沒(méi)有排列。記住先是字典序,才能用它產(chǎn)生去全排列。 轉(zhuǎn)自http://blog.sina.com.cn/s/blog_60bf5fda0101dufm.html http://acm.swust.edu.cn/oj/PRoblem/140/ code:

#include#includeusing namespace std;char str[15];int main(){ int n,i,j; while(scanf("%d",&n)!=EOF) { for(i=0;i str[i]=i+'1'; str[n]='/0'; do { printf("%s/n",str); }while(next_permutation(str,str+n)); } return 0;}

第二種方法就是dfs:

#include#includeusing namespace std;int str[15];//保存輸出的字母表int visit[15];//標(biāo)記是否讀過(guò)int n;void dfs(int depth)//深度、也就是每次dfs增加一個(gè)數(shù)字、直到N個(gè)數(shù)字的時(shí)候輸出{ int i,j; for(i=1;i<=n;i++)//遍歷N個(gè)數(shù)字 { if(visit[i]==0)//如果沒(méi)有讀過(guò)此數(shù)字、則將這個(gè)數(shù)字放進(jìn)輸出表中、 { str[depth]=i; visit[i]=1;//標(biāo)記為已打印 if(depth dfs(depth+1); else//滿足題意、已經(jīng)得到N個(gè)數(shù),則打印出來(lái) { for(j=1;j<=n;j++) printf("%d",str[j]); printf("/n"); } visit[i]=0;//如果已經(jīng)打印一行之后、把以前的重新標(biāo)記為未讀 } }}int main(){ int i,j; scanf("%d",&n); memset(visit,0,sizeof(visit)); dfs(1); return 0;}

怎么說(shuō)了、這個(gè)代碼還是很好理解的、 假設(shè)N=3 那么第一次循環(huán)、123、沒(méi)有問(wèn)題 當(dāng)運(yùn)行打印的之后、將3標(biāo)記為未讀、則為13、再往前回溯、得到2、則輸出132 繼續(xù)往前回溯、for循環(huán)已經(jīng)過(guò)了一遍、 所以開(kāi)頭為2、所以是213 同理就是231 同理就是 312 321 仔細(xì)想一下就是這樣了


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 疏勒县| 临邑县| 驻马店市| 扶余县| 盐亭县| 临夏县| 隆尧县| 利辛县| 招远市| 金塔县| 高唐县| 临潭县| 宿州市| 聂拉木县| 扬州市| 蒙山县| 定边县| 博客| 集安市| 莆田市| 盘山县| 池州市| 景德镇市| 河东区| 乌海市| 定兴县| 江油市| 兴和县| 伊宁市| 江口县| 栖霞市| 瑞金市| 余江县| 泾阳县| 西乌珠穆沁旗| 库车县| 石屏县| 满城县| 清涧县| 平武县| 济南市|