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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

利用next_permutation解答全排列问题

發(fā)布時(shí)間:2025/3/12 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用next_permutation解答全排列问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

枚舉所有排列的另一個(gè)方法是從字典序最小排列開始,不停調(diào)用“求下一個(gè)排列”的過 程。
全排列的個(gè)數(shù)A(N,N)=(N)(N-1)…*2*1=N!
下一個(gè)排列:通常按照升序順序(字典序)獲得下一個(gè)排列
stl

next_permutation找下一個(gè)排列的算法

如果一個(gè)數(shù)組arr[]中存在重復(fù)元素,next_permutation是否工作正常呢?

STL使用“!(*i < *j)”進(jìn)行判斷大小,若相等則繼續(xù)尋找,這樣就會(huì)跳過重復(fù)的元素,進(jìn)而跳過重復(fù)的全排列(如:1,2,2; 和1,2,2)。

返回值?

當(dāng)返回為1時(shí),表示找到了下一全排列;返回0時(shí),表示無(wú)下一全排列。注意,如果從begin到end為降序,則表明全排列結(jié)束。

原理?

一個(gè)目的,不斷地找最接近這個(gè)排列的下個(gè)排列,直到全部降序?yàn)橹?/p> template<calss BidrectionalIterator> bool next_permutation(BidrectionalIterator first,BidrectionalIterator last) { if(first == lase) return false; /* 空區(qū)間 */ BidrectionalIterator i = first; ++i; if(i == last) return false; /* 只有一個(gè)元素 */ i = last; /* i指向尾端 */ --i; for(;;) { BidrectionalIterator ii = i; --i; /* 以上鎖定一組(兩個(gè))相鄰元素 */ if(*i < *ii) /* 如果前一個(gè)元素小于后一個(gè)元素 */ { BidrectionalIterator j = last; /* 令j指向尾端 */ while(!(*i < *--j)); /* 由尾端往前找,直到遇到比*i大的元素 */ iter_swap(i,j); /* 交換i,j */ reverse(ii,last); /* 將ii之后的元素全部逆序重排 */ return true; } if(i == first) /* 進(jìn)行至最前面了 */ { reverse(first,last); /* 全部逆序重排 */ return false; } } }

怎么用?
#include<cstdio> #include<algorithm> //包含next_permutation using namespace std; int main( ) { int n, p[10]; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &p[i]); sort(p, p+n); //排序,得到p的最小排列 do { for(int i = 0; i < n; i++){printf("%d ", p[i]); //輸出排列p}printf("\n"); } while(next_permutation(p, p+n)); //求下一個(gè)排列 return 0; }

do…while 循環(huán)是 while 循環(huán)的變體。在檢查while()條件是否為真之前,該循環(huán)首先會(huì)執(zhí)行一次do{}之內(nèi)的語(yǔ)句,然后在while()內(nèi)檢查條件是否為真,如果條件為真的話,就會(huì)重復(fù)do…while這個(gè)循環(huán),直至while()為假。

總結(jié)

以上是生活随笔為你收集整理的利用next_permutation解答全排列问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。