麻雀大会の卓組問題を考える。 最も一般化された卓組問題は「Ni人のプレイヤーからなるチーム i (0 ≦ i < n) による麻雀大会において、どの異なる2つのチームからプレイヤーを1人ずつ選んでも、その間の同卓回数が [m..M] であるような卓組を求めよ」と定式化される。 ただし、麻雀大会は同時性 (全ラウンドで全プレイヤーがただ1つの卓について同時にプレイすること) や 斉次性 (全プレイヤーが同じ回数をプレイすること) を必ずしも必要としないものとする。
個人戦のうち限られたいくつかの場合においては、全プレイヤーが同時に同じ回数をプレイし、全プレイヤーが全オポーネントと定数回数ずつ対戦する卓組が知られている。
4チーム戦とは、プレイヤーを卓数と同じ人数からなる4つのチームに分けて行うチーム戦である。 現実の運営においては、ラウンド数が十分に少ない (全オポーネントと対戦することが必要でない) 個人戦の麻雀大会を4チーム戦と扱うことがある。 4チーム戦はラウンド数が4の倍数であって座位を予め指定する大会の実際の運営にも向く。 4人チーム戦とは、プレイヤーを卓数と同じ数の4人からなるチームにわけて行うチーム戦である。 現実の運営においては、ラウンド数が十分に少ない4人チーム戦の麻雀大会を、4チーム戦から最初のラウンドを除いたものと扱うことがある。
next_permutation
を使用している。
再同卓チェックに引っ掛かったらそれより後の卓組を reverse
してから next_permutation
を呼び出すことによって、再同卓ラウンド以降を変更している。
これによって簡単な記述 (4人ゲームであることに特化しているため、再帰を使って書くのが自然な場面で2重ループを使ったり、チェックの関数を分けたりしているが) と高速な探索を両立できる。
コンパイルして実行すると、テーブル数をユーザへ尋ねる。
入力が0なら終了し、そうでなければラウンド数をユーザへ尋ねる。
与えられたテーブル数・ラウンド数に合致した卓組が可能ならば出力する。
そうでなければダミー (一目で再同卓の存在を確かめられる) 卓組を出力する。
3人8チーム6テーブル7ラウンドの完全解を掲載する。
テーブル数が十分に多くラウンド数が十分に少ないペア戦には、ペア間の再同卓を完全に防ぐ方法が存在する。
一般人数のチーム戦においては、厳密解のある条件を得ていない。
以下のツールは Microsoft Visual Basic 2008 Express Edition で開発したため、実行には .NET Framework を要する。
卓組生成プログラムで使用している同卓チェッカーを切り出して公開する: 同卓チェッカー 入力例 出力例
入力 (ボタンの上のテキストボックス) の各行は、ある卓であるラウンドにプレイするプレイヤーの番号をタブ区切りで並べたものとする。 出力の第1行および第1列はヘッダである。 該当する番号のプレイヤー同士が同卓した回数を (ボタンの下のテキストボックスへ) 出力する。 同卓チェッカーは入力エラー (数字とタブと改行以外の文字列がある時の動作)・大会の同時性・斉次性をチェックしない。 したがって、麻雀以外の一般人数によるゲームの大会構成や「大将戦」を採用する大会にも応用が可能である。
生成された卓組からプレイヤー用の卓組データを作成するコンバータを公開する: 卓組コンバータ 入力例 出力例
入力は各ラウンドを表すブロックからなる。 ラウンドとラウンドとの間にはちょうど1つの空行を必要とする。 各ラウンドは卓数と同じ数の行からなり、各行はある卓であるラウンドにプレイするプレイヤーの番号をタブ区切りで並べたものとする。 座位をチェックするとこれは順不同ではなくなり、左から順に東南西北となる。 出力の第1列はヘッダである。 該当する番号のプレイヤーが各ラウンドにつく卓 (座位をチェックした場合は卓と座位) を示す。