麻雀の向聴数のアルゴリズム 清一色編 概要

猫と麻雀 麻雀のプログラミング

一般手の向聴数

清一色の向聴数が分かればその他の向聴数も同様にして求めることができます。字牌は数牌よりも簡単なので、清一色の向聴数が分かれば十分です。

清一色のパターン

清一色における数牌のパターンは以下の通りです。これは、各数字において、\( 0 \) から \( 4 \) までの牌の数が考えています。

手牌の数 パターン
1 9
2 45
3 165
4 495
5 1278
6 2922
7 6030
8 11305
9 19855
10 32211
11 48879
12 69675
13 93600
14 118800
合計 405349

これらのパターンは対称、平行移動、孤立牌などの条件を考えるとさらに減らすことができますが、それらは考えないものとします。これらのパターンにおいて、前回の向聴数の公式の \( a, b, c \) を求めます。

向聴数の公式

面子の数を \( a \)、面子候補 (搭子、対子)の数を \( b \)、雀頭を \( c \) とすると、向聴数 \( f(a,b,c)\) は、

\[ f(a, b, c) = 8 – 2a – b – c \]

と表現できます。ただし、\( 0 \leq a + b \leq 4 \wedge -1 \leq c \leq 1 \) であり、

\[ -1 \leq f(a, b, c) \leq 8\]

を満たします。さらに、

\[ g(a, b) = 8 – 2a – b\]

とし、

\[f(a, b, c) = g(a, b) – c\]

とします。

ここで、\( c \) を固定した時、\( g(a, b) \) を最小化する \( a, b \) の値を求めます。\( c \) を固定とは、\( 3 \) 通りのパターンがあります。また、\( g(1, 1) = g(0, 3) \) となりますが、この時は \( a \) の値が大きい方を採用します。便宜上手牌が \( 0 \) 枚のときも考えます。

\( c \) を固定

\( c = 1 \) のとき

このとき雀頭が存在するという意味です。与えられた手牌に雀頭が存在しないとき、\( (a, b) = (-1, -1) \) とします。雀頭が存在しないという条件は、同じ牌が \( 2 \) 枚以上存在しないということです。例えば、

一萬一萬一萬四萬

のとき、\( (a, b) = (0, 0)\) となります。

一方で、

一萬一萬一萬一萬

のとき、\( (a, b) = (0, 0) \) となります。一萬一萬 を雀頭とすると、もう片方の対子が面子となることはないので、こうなります。

\( c = 0 \) のとき

このとき雀頭候補が存在するという意味です。手牌に牌が \( 1\) 枚以上存在すれば雀頭候補となりえるので、手牌が \( 0 \) 枚ではないとき、\( a \geq 0 \wedge b \geq0 \) が保証されます。手牌が \( 0 \) 枚のときは、\( (a, b) = (-1, -1) \) となります。

一萬一萬一萬四萬

では、\( (a, b) = (1, 0) \) となります。これは、四萬 が雀頭候補となるためです。一方で、

一萬一萬一萬一萬

のとき、\( (a, b) = (0, 0) \) となります。一萬 を雀頭候補としてみなすと、暗刻として面子を取ることができず、面子候補ともなりません。

\( c = -1 \) のとき

このとき雀頭候補が存在しません。手牌が \( 0\) 枚のときでもこの条件を満たすので、常に \( a \geq 0 \wedge b \geq 0 \) を満たします。

一萬一萬一萬四萬

では、\( (a, b) = (1, 0) \) となります。この手牌の分解は、\( f(1, 0, 1) \) が最適な分解ですが、\( f(1, 0, -1) \) として分解できるということです。

一方で、

一萬一萬一萬一萬

のとき、\( (a, b) = (1, 0) \) となります。この手牌の分解は、\( f(1, 0, -1) \) が最適な分解です。

\( g(a, b)\) について

\( g(a, b) \) が同じ値を取るとき

\( (a, b) \) のパターンによって同じ \( g(a, b)\) が同じ値を取ることがあります。それは、次のパターンです。

\[
\begin{array}{cc}
\hline
g(a, b) & a & b & 3a + 2b\\ \hline
2 & 1  & 0 & 3\\
2 & 0 & 2 & 4\\
3 & 1 & 1 & 5\\
3 & 0 & 3 & 6\\
4 & 2 & 0 & 6\\
4 & 0 & 4 & 8\\ \hline
\end{array}
\]

これらの場合は、\( a \) の値が大きい方を正しい分解とします。これは、使われいる牌の枚数が \( 3a + 2b \) であり、\( 0 \leq a + b \leq 4 \) という制約からも正しいと思います。

また、当然ですが、\( c \) を固定したときの、\( g_c(a, b) \) とすると、\( g_{-1}(a, b) \leq g_0(a, b) \leq g_1(a, b) \) です。

\( g(1, 0) \) と \( g(0, 3) \) について

\( g(1, 0) < g(0, 3) \) となりますが、\( 1 \) 面子または \( 3 \) 面子候補に分解できる手牌を考えます。

一萬三萬四萬四萬五萬七萬

この手牌は\ ( 1 \) 面子または \( 3 \) 面子候補に分解できます。三萬四萬五萬 と面子を取ると、面子候補がなくなります。暗刻として面子を取れる手牌では、 \( g(1, 0) \) または \( g(0, 3) \) と分解できることはありません。これは、暗刻の牌を \( a \) としたとき、\( a \) と面子候補になる牌は、

\[ a – 2, a – 1, a, a + 1, a + 2\]

となります。これらの牌から任意に \( 3 \) つ選ぶと必ず面子候補になります。次に \( 7 \) 枚の手牌で分解できるかを考えます。順子を \( a – 1, a, a + 1\) とします。この順子と面子候補になる牌は、

\[ a – 3, a – 2, a – 1, a, a + 1, a + 2, a + 3\]

となります。これらの牌から面子候補にならない牌を \( 3 \) つ選ぶと、\( a – 3, a, a + 3 \) となります。この \( 3 \) つと面子候補にならない牌は、\( a – 6, a + 6\) が考えられますが、これらの牌は存在しません。\( a \) の候補は、\( a = (4, 5, 6) \) であるためです。したがって、\( 7 \) 枚の手牌では分解できません。

つぎに、これらの手牌で、\( c \) を固定した時の分割を考えます。手牌は、

\[a – 3, a – 1, a, a, a + 1, a + 3\]

です。

\( c = 1 \) のとき

このときは、\( g(0, 2) \) となります。

\( c = 0 \) のとき

このときは、\( g(1, 0) \) となります。

\( c = -1 \) のとき

このときは、\( g(0, 3) \) となります。

コメント

タイトルとURLをコピーしました