###知りたいこと
std::next_permutationの使い方が間違っているのかも知れません。
いわゆる順列のみのリストが欲しいです。
サンプルコードのどこに問題があるのかご教示頂けると助かります。
###現状
std::next_permutationで順列を作成すると引数のリストの中から各要素を1回づつ使ったものが生成されるはずなのですが、何故か同じ要素が何度も使われたリストが出来てしまいます。
このリストを使った問題を解きたいのですがこのリストが間違っているので躓いてしまっています。
###試したこと
デバッグでvector配列の中身を少しだけ出力などして確認するとやはりおかしな数値が紛れていました。
###サンプルコード
質問用に最低限の部分のみ抜粋
C++
1#include <cstdio> 2#include <iostream> 3#include <iterator> 4#include <algorithm> 5#include <vector> 6 7//順列リストから数値に変換 8unsigned get_pd(const std::vector<unsigned> &v) 9{ 10 unsigned result = 0; 11 for (auto x : v) 12 { 13 result = 10 * result + x; 14 } 15 return result; 16} 17 18void qa_test() 19{ 20 //順列リスト作成 21 std::vector<unsigned> vpd({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); 22 std::vector<unsigned> vpds; 23 do 24 { 25 vpds.push_back(get_pd(vpd)); 26 } while (std::next_permutation(vpd.begin(), vpd.end())); 27 28 //少しだけ中身の確認 29 unsigned count = 0; 30 for (auto x : vpds) 31 { 32 ++count; 33 34 //問題のある数値の位置を確認 35 // if (x == 1168105595) 36 // { 37 // std::cout << count << std::endl; 38 // break; 39 // } 40 41 //最初の一部を出力 42 if (count > 0 && count < 10) 43 { 44 std::cout << x << std::endl; 45 } 46 47 //問題のある数値の一部を出力 48 if (count > 1998050) 49 { 50 std::cout << x << std::endl; 51 } 52 53 if (count > 1998060) 54 { 55 break; 56 } 57 } 58 std::cout << std::endl; 59 60 return; 61} 62 63int main() 64{ 65 qa_test(); 66 getchar(); 67 return 0; 68} 69
//配列の最初の一部を出力 123456789 123456798 123456879 123456897 123456978 123456987 123457689 123457698 123457869 //問題のある数値の一部を出力 1168104533 1168104596 1168104632 1168104686 1168104893 1168104902 1168105523 1168105595 1168105622 1168105685 1168110833
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。