- ベストアンサー
プログラミングの質問:異なる数字の分け方と麻雀卓の組み合わせ
- 質問01: 16個〜24個の数字から、和が0になるように4つずつ分けるプログラムを作成したい。
- 質問02: 10人〜20人の人数で4人ずつ座らせた麻雀卓で5回戦を戦わせる組み合わせを自動的に割り出すプログラムを作成したい。
- プログラミング初心者が質問。助けていただけると幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問01についてですが、 ( 45, 10, -25, -30 ) ( 55, 20, -45, -30 ) ( 25, 15, -10, -30 ) ( 80, 25, -35, -70 ) の組み合わせ以外に、例えば、 ( 45, 15, -30, -30 ) ( 55, 20, -45, -30 ) ( 25, 10, -10, -25 ) ( 80, 25, -35, -70 ) の組み合わせも可能だと思うのですが、その組み合わせでもよいのなら、次のようなプログラムでもできます。( C/C++ で書きました。) #include <stdio.h> #define TRUE 1 #define FALSE 0 #define NUM 16 #define MEMBERS 4 int num[ NUM ] = { 80, 55, 45, 25, 25, 20, 15, 10, -10, -25, -30, -30, -30, -35, -45, -70 }; int grp[ NUM ] = { 0 }; int Search( int start, int group, int sum, int count ); void Display( int group ); int main( void ) { Search( 0, 1, 0, 0 ); for( int i = 1; i <= MEMBERS; i++ ) { Display( i ); } return 0; } int Search( int start, int group, int sum, int count ) { for( int i = start; i < NUM; i++ ) { if( grp[ i ] == 0 ) { if( count == MEMBERS - 1 ) { if( sum + num[ i ] == 0 ) { grp[ i ] = group; if( group == ( NUM / MEMBERS ) ) { return TRUE; } if( Search( 0, group + 1, 0, 0 ) ) { return TRUE; } grp[ i ] = 0; return FALSE; } } else { grp[ i ] = group; if( Search( i + 1, group, sum + num[i], count + 1 ) ) { return TRUE; } grp[ i ] = 0; } } } return FALSE; } void Display( int group ) { int count = 0; printf( "( " ); for( int i = 0; i < NUM; i++ ) { if( grp[ i ] == group ) { printf( "%d", num[ i ] ); count++; if( count < MEMBERS ) { putchar( ',' ); putchar( ' ' ); } } } puts( " )" ); } 出力結果 ( 80, 25, -35, -70 ) ( 55, 20, -30, -45 ) ( 45, 15, -30, -30 ) ( 25, 10, -10, -25 )
その他の回答 (3)
- tsukasa-12r
- ベストアンサー率65% (358/549)
一部訂正です。 for( int i = 1; i <= MEMBERS; i++ ) { Display( i ); } は for( int i = 1; i <= ( NUM / MEMBERS ); i++ ) { Display( i ); } の間違いです。
お礼
修正の方もありがとうございました。また、他にも、色々なパターンで16個の数字を0になるように4組ずつ分けることができ、12個の場合も問題なく4組ずつわけることができました。私が考えていたように変数が多いわけではないので、これは本当に楽にできました。本当にありがとうございました。
- asuncion
- ベストアンサー率33% (2127/6289)
#1の者です。 麻雀の競技結果の集計だから、ゼロサムになるのは当たり前でしたね。 16個、20個、24個くらいであれば、それらから4個を選ぶ組合せを 総当たりで求めてもさほど大きな数にはならないので、 愚直ではありましょうがいちばん確実だと思います。
お礼
愚直に、組み合わせを考えてfor文と変数を組み合わせてやっていけばいいですかね。やはり、簡単な方法はありませんよね(笑)。私も同意見だったので、愚直にやっていこうかと思います。ありがとうございました(^-^)!!
- asuncion
- ベストアンサー率33% (2127/6289)
質問01についてお聞きします。 当該の16個、20個、または24個の整数の全体の合計が0であることは 保証済みなのでしょうか。
補足
はい、それはもちろん保証済みです。合計は0になり、元々4つずつの合計が0だったものなのですが、どの4つの数字の組み合わせが0であったのかがわからなくなってしまったのです。
お礼
これは、本当にありがとうございました。まさか、ソースまで書いていただけるとは本当にうれしい限りです。早速、中身を解析しつつやってみます。ありがとうございました。本当に助かりましたm(_ _)m。