以下の内容はhttps://smooth-pudding.hatenablog.com/entry/2025/08/16/130310より取得しました。


ノッカノッカの局面数をざっくり計算する

こんにちは。
趣味のボドゲ解析の次のターゲットとして、今回はノッカノッカについて調べてみようと思います。
解析するにも、まずはゲームのサイズを見極める必要があるので、局面数について調べていきます。

ノッカノッカとは

二人対戦型のボードゲームです。以前 QuizKnock でも紹介されていました。
www.youtube.com

ノッカノッカの公式サイトがあり、現在もオンラインで購入できるようです。
www.undanoga.com

上記サイトではスマートフォンゲームとしても公開されています。ルールを理解するには実際に遊んでみるのが一番早いかもしれません。どうやらサービス終了しているみたいです。無念。

局面の数え方の作戦

ノッカノッカのルールのうち、局面の数え上げに利用できる特徴を整理します。

  • 白と黒のコマを利用する。同色のコマ同士の区別はない。
  • 白と黒はそれぞれ5個。ゲーム中増減することはない。
  • あるコマが別のコマに乗っかることができる。ただし高さは最大で3。
  • コマは 5×6 のマス目上を移動する。

そこで、以下のような2ステップで数えてみることにします。

1. 色のついていないコマ10個の配置の仕方を考える
2. 色の塗り方を考える

作戦実行

色のついていないコマ10個の配置の仕方を考える

ボード上に並べる前に、積まれ方の組み合わせを列挙してみます。1〜3 の組み合わせで、合計が 10 になるものをすべて列挙すると、以下の14組となります。

  • (1, 3, 3, 3)
  • (2, 2, 3, 3)
  • (1, 1, 2, 3, 3)
  • (1, 1, 1, 1, 3, 3)
  • (1, 2, 2, 2, 3)
  • (1, 1, 1, 2, 2, 3)
  • (1, 1, 1, 1, 1, 2, 3)
  • (1, 1, 1, 1, 1, 1, 1, 3)
  • (2, 2, 2, 2, 2)
  • (1, 1, 2, 2, 2, 2)
  • (1, 1, 1, 1, 2, 2, 2)
  • (1, 1, 1, 1, 1, 1, 2, 2)
  • (1, 1, 1, 1, 1, 1, 1, 1, 2)
  • (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

これらをボード上に配置する方法を考えます。いくつかピックアップして具体的に考えてみます。

まず (2, 2, 3, 3) について。まず2のスタックを2個並べます。マスは30個あるので、これらの並べ方は {}_{30}\mathrm{C}_{2}=435 通りになります。次に3のスタックを2個並べます。残りのマスは28個なので、並べ方は {}_{28}\mathrm{C}_{2}=378 通りになります。これらの積 435 \times 378 = 164,430 が全体の並べ方の総数です。

次に (1, 1, 2, 3, 3) を考えてみます。先程と同様の考え方で、以下のように計算できます。

  • 1 のスタックの並べ方は {}_{30}\mathrm{C}_{2} = 435 通り
  • 2 のスタックの並べ方は {}_{28}\mathrm{C}_{1} = 28 通り
  • 3 のスタックの並べ方は {}_{27}\mathrm{C}_{2} = 351 通り

したがって総数は 435 \times 38 \times 351 = 4,275,180 通りとなります。

一般化しましょう。1 のスタックが x 個、2 のスタックが y 個、3 のスタックが z 個ある場合、並べ方の総数は

{}_{30}\mathrm{C}_{x} \times {}_{30-x}\mathrm{C}_{y} \times {}_{30-x-y}\mathrm{C}_{z}
と表されます。ちなみにすこしだけ式を整理すると
\dfrac{30!}{x!y!z!(30 - x - y - z)!}
となります。

以下、それぞれのパターンでの並べ方の総数を表にしたものです。

スタックの高さの組 スタック数 並べ方の総数
(1, 3, 3, 3) (1, 0, 3) 109,620
(2, 2, 3, 3) (0, 2, 2) 164,430
(1, 1, 2, 3, 3) (2, 1, 2) 4,275,180
(1, 1, 1, 1, 3, 3) (4, 0, 2) 8,906,625
(1, 2, 2, 2, 3) (1, 3, 1) 2,850,120
(1, 1, 1, 2, 2, 3) (3, 2, 1) 35,626,500
(1, ..., 1, 2, 3) (5, 1, 1) 85,503,600
(1, ..., 1, 3) (7, 0, 1) 46,823,400
(2, 2, 2, 2, 2) (0, 5, 0) 142,506
(1, 1, 2, 2, 2, 2) (2, 4, 0) 8,906,625
(1, ..., 1, 2, 2, 2) (4, 3, 0) 71,253,000
(1, ..., 1, 2, 2) (6, 2, 0) 163,881,900
(1, ..., 1, 2) (8, 1, 0) 128,764,350
(1, ..., 1) (10, 0, 0) 30,045,015
合計 587,252,871

色の塗り方を考える

各コマに対して、以下の要領で 1〜10 の番号を振ります。

  • 30個のマスに 1〜30 の番号をつける
  • 上記の番号の順にマスを確認し、コマがあったら下から順番にコマに番号を振る

あとは 1〜10 に対して黒 or 白を対応させる組み合わせを列挙すれば、すべての塗り方が考えられます。これは {}_{10}\mathrm{C}_{5} = 252 通りです。

並べ方の総数を計算

以上で2ステップが完了したので、すべての並べ方を計算すると

587,252,871 \times 252 = 147,987,723,492 \approx 10^{11}
となりました。局面の反転対称性*1を考慮すれば、さらに半分ぐらいになりそうです。

局面数について考察

以前、Tokyo Doves の局面数を数えた際に、局面数について軽くレビューしました。
smooth-pudding.hatenablog.com

ポイントは以下です。

  • 現在人類が完全解析に成功している 6×6 オセロの局面数がおおよそ 3.6 \times 10^{12}
  • Tokyo Doves の局面数は 5.1 \times 10^{11}
  • つまり Tokyo Doves はギリギリなんとか完全解析できる可能性がある (後日、実際に完全解析をやりきれた)

今回も、なんと約 10^{11} という絶妙な数値で、ノッカノッカもギリギリ完全解析できる可能性が見えてきました。ワクワクですね。

ではまた。

おまけ

この記事での計算方法を Python で実装してみました。

NUM_CELLS = 30
NUM_WHITE = 5
NUM_BLACK = 5


def solve_x_2y_3z(rhs: int):
    """x + 2y + 3z = rhs を満たす非負整数 (x, y, z) を全列挙する"""
    if rhs < 0:
        return

    for z in range(rhs // 3 + 1):
        for y in range((rhs - 3 * z) // 2 + 1):
            x = rhs - 2 * y - 3 * z
            yield x, y, z


def main():
    import math

    num_pieces = NUM_BLACK + NUM_WHITE
    num_patterns = sum(
        math.comb(NUM_CELLS, x)
        * math.comb(NUM_CELLS - x, y)
        * math.comb(NUM_CELLS - x - y, z)
        for x, y, z in solve_x_2y_3z(num_pieces)
    )
    print(f"パターン総数: {num_patterns:,}")

    total_positions = num_patterns * math.comb(num_pieces, NUM_BLACK)
    print(f"総局面数: {total_positions:,}")


if __name__ == '__main__':
    main()

以下で実行できます。

*1:5マスの向きの中央で反転しても、ルール上局面の効果は変わりません。




以上の内容はhttps://smooth-pudding.hatenablog.com/entry/2025/08/16/130310より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14