技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

プログラマ脳を鍛える数学パズル 09

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

釣り合わない男女という問題。
問題は書籍を見るんだー説明が長文になるのでめんどい

boy, girl = (20 + 1, 10 + 1)

map = [[0 for f in range(girl)] for m in range(boy)]
map[0][0] = 1

for f in range(girl):
    for m in range(boy):
        left = 0
        bottom = 0

        if m > 0:
            left = map[m - 1][f]
        if f > 0:
            bottom = map[m][f - 1]

        # 先頭グループが釣り合うケースはカウントしない
        # もしくは、後半グループが釣り合うケースでもカウントしない
        if m == f or (boy - m == girl - f):
            left = 0
            bottom = 0

        map[m][f] = map[m][f] + left + bottom

# どういうマップになっているのかの確認用
#for line in map:
#    print([format(v, "6d") for v in line])

print(map[19][10])

多分これはマップの特定座標まで何通りの行き方があるのか計算する為の考え方と、問題文をそれに当てはめるという2つの要素が問題の趣旨だと思われる。
全力で無視するなら順列作ってさっさと判定してしまえばいい(多分見た目はもっともシンプルになる。速度にさえ目を瞑れば…)。