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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

使用next_permutation()的坑,你中招了么?

發布時間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用next_permutation()的坑,你中招了么? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 問題描述
  • 解決
  • 猜想
  • 總結

今天在做一道題,結果答案始終不對,思路雖然有點笨吧,但是方法一定是沒有問題的。
經過一系列的排除,發現是next_permutation()函數的問題。

問題描述


http://oj.ecustacm.cn/problem.php?id=1301

做這道題的時候,一看不就是一個全排列么?。
用next_permutation()函數就完了

#include<cstdio> #include<algorithm> #include<cmath> #define ll long long using namespace std; int a[8]={2,3,5,8,1,4,6,7}; int main(void) {int n=0;ll sum1,sum2;do{bool flag1=false;bool flag2=false;bool flag3=false;bool flag4=false;sum1=pow(a[0]*10+a[1],2)+pow(a[2]*10+a[3],2)+pow(a[4]*10+a[5],2)+pow(a[6]*10+a[7],2);sum2=pow(a[0]+a[1]*10,2)+pow(a[2]+a[3]*10,2)+pow(a[4]+a[5]*10,2)+pow(a[6]+a[7]*10,2);if(a[0]==8||a[2]==8||a[4]==8||a[6]==8)flag1=true;if(a[0]==5||a[2]==5||a[4]==5||a[6]==5)flag2=true;if(a[0]==3||a[2]==3||a[4]==3||a[6]==3)flag3=true;if(a[0]==2||a[2]==2||a[4]==2||a[6]==2)flag4=true;if(flag1&&flag2&&flag3&&flag4){if(sum1==sum2){n++;}}}while(next_permutation(a,a+8));printf("%d %d\n",n,n/24);return 0; }

正確的答案應該是 576 24
但是運行的結果卻不盡人意,我很好奇為啥?

解決

經過我一系列的排除,我覺的數組的數據初始排列應該有問題。
經過我的一修改。奇妙的好了。

雖然結果正確了,但是我不禁陷入了沉思。
為啥啊?

我又翻書看一下對于next_permutation()的描述。頓時大悟。
原來next_permutation()是按字典序依次排列的,當排列到最大的值是就會返回false.
之前的我用習慣了,忘了最初的概念,當時也沒深究,反正用它就是算全排列的,于是造成了做題種出現了錯誤。

猜想

既然又對next_permutation()函數加深了了解。
那么我們就來實踐一下。
猜想:
根據定義next_permutation()函數是按字典序依次排列的,排列到最大停止。
那么如果剛開始的數據的字典序就是最大的,那么應該就只會運行一次,即初始的值。

由上圖可以看到我們的猜想是正確的。

總結

next_permutation()函數是按字典序排列的函數。它與初始的數組的值是息息相關的。
不要以為隨便一個數組,用next_permutation()函數就可以得到全排列。
要時刻的記住里面的特性。

為了保險起見。在使用前可以先排序數組。再用next_permutation()。

下面是另一位博主寫的關于next_permutation的另一個大坑,寫的很不錯。
我這里就不造輪子了。
C++中全排列函數next_permutation的一個大坑

總結

以上是生活随笔為你收集整理的使用next_permutation()的坑,你中招了么?的全部內容,希望文章能夠幫你解決所遇到的問題。

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