Pythonで「エイトクイーン」を考える

プログラミング

エイトクイーンとは?

駒の移動できる場所利き筋と呼びます。

クイーンの利き筋例

チェスのクイーンでは、利き筋が縦、横、斜めのラインのマスです。

エイトクイーンとは、チェスの盤面においてお互いに利き筋にならないように8コのクイーンを配置するパズルのことを言います。


Pythonで表現すると

「Visual Studio Code」で記述した場合こちらが綺麗に表示されました。

#例えばq[1]は、一列目にはQがどの行に配置されているかを表す
#エイトクイーンは、お互いにとられないように配置するため、同じ行、列、斜めのラインに配置されることはない

q = [0]*8#列を表すインデックスとなる
pattern = 0

def put_q(x):
    q[x] = 0
    global pattern
    while True:
        c = chk_q(x, q[x])#q[x]より以前のものと比較して置ける場所か判定
        if c == True:#おける場所だった場合、
            if x == 7:#最後の列だった場合
                pattern += 1#パターンとして追加
                prt_q()#表示させる
                break
            else:
                put_q(x+1)
        q[x] += 1
        if q[x]>=8:#x列目のどこにも置けなかった場合
            break

def chk_q(x,y):
    i = 0
    while (i < x):
        if q[i]!=y and q[i]!=y-x+i and q[i]!=y+x-i:
            i+=1
        else:
            ret = False
            return ret
    ret = True
    return ret

def prt_q():
    print(f"\nパターン{pattern}")
    for i in range(8):
        for j in range(8):
            if q[j]==i:
                print("  Q ", end="")
            else:
                print(" ・ ", end="")
        print("")
          
put_q(0)

エディッタに応じて、関数prt_q()のprint部分を変更して綺麗にに、エイトクイーンのパターン一覧が表示されるようにしてください。


プログラムコード解説

このプログラムコードでは、関数を再帰呼び出しを用いてエイトクイーンを表現しています。

関数put_q(x)」では、このエイトクイーンのメインとなる関数で、再帰呼び出しを行って最終的には、「関数chk_q(x,y)」を用いて全行全列でエイトクイーンが成立する配置を調べます。

関数chk_q(x,y)」では、x列目のy行目が配置できるましょかを調べてくれます。配置することができる場合は、Trueを返します。配置できない場合は、Falseを返します。

関数prt_q」では、確定したパターンを表示します。

put_q(0)から始まるこのプログラム。

0列目が0行目に配置された状態から1列目以降をエイトクイーンのルールに従って行を決めていく。

下のように、順に左から配置場所を決めていきます。

(※0列0行目から始まる)

1列目は、0列目の利き筋に入らないようにいっこは、0列目の利き筋に入らないように1個ずつ上から配置していきます。今回の例だと、1列目は2行目に配置されることが分かります。また、2列目では、0列目のクイーンと1列目のクイーンのクイーンの利き筋に入らないように配置します。今回の例だと、2列4行目に配置されることになります。同じように1列ずつ配置場所を決めていきます。

しかし、1列ずつ配置場所を決めていくと問題が起こります。

↓のように、×が一番下の行までいき、5列目では、配置することができないことになります。

この場合は、一つ前の列の行を一段下げるということを行います。

5列目で配置することができなかったため、1つ前の列の配置を1段下げます。

ですが、ここで1段下げる場合もエイトクイーンのルールに従う必要があるので、今回の場合だと

3列1行目に配置されていた×が、3列6行目に配置されることになります。

また、4列3行目に配置されていた×が4列1行目に移動し、5列目は3行目に配置することができました。

このように、調整してクイーンを配置していきます。

最終的に、7列目まで配置することができた配置がエイトクイーン配置の一つとなります。

エイトクイーンの場合、配置できるのは92通りです。

最初にエイトクイーン配置が決まるのは、

となります。

コメント

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