3

現在の麻雀の手が勝ち手かどうかを判断するアルゴリズムを探しています。ゲームに慣れていない場合は、基本的な考え方 (簡略化) を次に示します。

  • タイルは 3 組あり、それぞれにランク 1 ~ 9 のタイルが含まれています。特別なタイルもあり、7 種類あります。各タイルは 4 つのコピーで存在するため、各スーツのタイルは 36 枚、特別なタイルは 28 枚あります。
  • 手札には 14 枚のタイルがあります。
  • チャウは、連続したランクを持つ 1 つのスーツの 3 つのタイルのセットです。
  • ピンポンは 3 つの同一の牌のセットです。
  • コングは 4 つの同一の牌のセットです。
  • ペアは、2 つの同一のタイルのセットです。
  • 勝ちの手とは、タイルが任意の数のチャウ、ポン、および/またはコングと 1 つのペアを形成するものです。

ハンドはスーツ順、次にランク順でソートされます。私の考えは次のようなものです:

  1. すべてのタイルを未訪問で未勝利としてマークします。
  2. 最初の未訪問のタイルにアクセスします。
  3. チャウ、ポン、またはコングに遭遇するまで、またはその可能性がなくなるまで、後続の牌を確認してください。組み合わせが完了したら、参加しているすべてのタイルを訪問して勝利としてマークします
  4. すべてのタイルにアクセスした場合は、すべてのタイルが勝っているかどうかを確認します。すべてのタイルが訪問されていない場合は、2 に進みます。

問題は、タイルがコンビネーションの一部になると、他のコンビネーションのメンバーになることはできず、ハンドを勝ちにする可能性があることです。

実用的なアルゴリズムのアイデアはありますか?

4

1 に答える 1

1

アルゴリズムをバックトラッキング アルゴリズム ( http://en.wikipedia.org/wiki/Backtracking )に埋め込めば問題ありません。これを行う最も簡単な方法は、一致するペア/チョウ/... が見つかったらメソッドを再帰的に呼び出すことですが、そうでない場合は現在の選択を破棄します。擬似コードでは、これは次のようになります。

1. Mark all tiles as nonwinning
2. Call function Backtracking

Function Backtracking:
1. If all tiles are marked winning return WINNING else NONWINNING
2. Visit tiles as described in your algorithm
3. When found a chow/pong/... or the first pair    
   3.1. Mark those tiles as winning.     
   3.2. Afterwards call method Backtracking.    
   3.3. If return value of 3.2 is WINNING also return WINNING    
   3.4. Else unmark the tiles as nonwinning again    
4. If not finished search for pair/chow/... by looping to 3.
5. All combinations are done and no winning movewas found so return NONWINNING

背後にあるアイデアは、最初に各ペア/...を勝ちの手の一部として試すことですが、これがうまくいかない場合は、勝ちの手の一部ではないと仮定して同じことを試してください.

ウィニング ハンドであるかどうかだけでなく、ウィニング ペア/チャウ/...のすべての可能な組み合わせに関心がある場合は、ステップ 3.3 のリターンをスキップしてください。

于 2011-02-09T05:42:50.100 に答える