22 unsigned int 階乗(
const unsigned int 値,
const unsigned int 開始値 = 1 )
24 if ( 値 <= 開始値 ) {
return 1; }
25 return 値 *
階乗( 値 - 1, 開始値 );
39 template<
class T>
void 全表示本体( T* ptr )
43 for ( std::vector<unsigned int> seq = ptr->次(); seq.size(); seq = ptr->次() )
45 std::wcout << cnt++ << L
":";
46 for (
auto it = seq.rbegin(); it != seq.rend(); ++it )
48 std::wcout << wchar_t( L
'a' + *it );
50 std::wcout << std::endl;
52 std::wcout << L
"あるべき長さ = " << ptr->総数() << std::endl;
61 順列::順列(
const unsigned int 元数,
const unsigned int 取得長さ )
62 : m元数( 元数 ), m取得長さ( 取得長さ ? 取得長さ : 元数 )
75 std::vector<unsigned int>
順列::次()
79 if (
m現況.size() == 0 )
81 for (
unsigned int i = 0; i <
m取得長さ; ++i )
83 m現況.push_back( m取得長さ - 1 - i );
87 std::vector<unsigned int> sub(
m現況 );
88 auto subIt = sub.begin();
89 for (
unsigned int 桁 = 0; 桁 <
m取得長さ; ++桁 )
92 for (
unsigned int 値 =
m現況[ 桁 ] + 1; 値 <
m元数; ++値 )
94 if ( std::find( subIt, sub.end(), 値 ) != sub.end() )
100 for (
unsigned int k = 桁; k > 0; --k )
104 if ( c != 値 && std::find( subIt, sub.end(), c ) == sub.end() )
164 std::vector<unsigned int> r(
m順列.
次() );
165 for ( ; r.size(); r =
m順列.
次() )
168 unsigned int prev = *it;
169 for ( ++it; it != r.end(); ++it )
171 if ( prev <= *it ) {
break; }
174 if ( it == r.end() ) {
break; }
std::vector< unsigned int > 次()
次の配列を生成して返します
unsigned int m取得長さ
毎回返す集合の大きさです
void 全表示本体(T *ptr)
順列や組み合わせの一巡内容を表示します、デバッグ用です
void 全表示()
すべての解答を構築し、標準出力に流します、デバッグ用です
std::vector< unsigned int > 次()
次の配列を生成して返します
順列(const unsigned int 元数, const unsigned int 取得長さ=0)
構築子
std::vector< unsigned int > m現況
直前に返した組を保持しています
void 全表示()
すべての解答を構築し、標準出力に流します、デバッグ用です
順列または組み合わせの反復取得クラスを宣言しているヘッダファイルです
unsigned int 総数() const
構築子で与えられた設定において幾通りの解答があるかを返します
unsigned int 階乗(const unsigned int 値, const unsigned int 開始値=1)
階乗もしくは階乗の部分積を返します
組み合わせ(const unsigned int 元数, const unsigned int 取得長さ=0)
構築子
unsigned int 総数() const
構築子で与えられた設定において幾通りの解答があるかを返します