プログラムをそのまま示したのではためにならないと思うので、考え方だけ示します。
1.回転座標
簡単な例で考えましょう。
4x4の場合で考えると、(クイーンの効き筋も無視します)
たとえばcolが[0, 1, 3, 2]の場合
クイーンは
Q . . .
. Q . .
. . . Q
. . Q .
という配置になっています。
それぞれ
横 → 縦の順に座標を考えると
col[0] = 0 → 座標[1, 1]
col[1] = 1 → 座標[2, 2]
col[2] = 3 → 座標[3, 4]
col[3] = 2 → 座標[4, 3]
となっていることがわかります。
上の図を90度左回転させると
. . Q .
. . . Q
. Q . .
Q . . .
という配置になります。
それぞれ回転前と回転後の座標の対応関係を見ると
元の座標[1, 1] → 回転後の座標[1, 4]
元の座標[2, 2] → 回転後の座標[2, 3]
元の座標[3, 4] → 回転後の座標[4, 2]
元の座標[4, 3] → 回転後の座標[3, 1]
となっています。
つまりこれを一般化すると
[a,b] を左に90度回転させた場合、回転後の座標は[b, N-a+1]
という規則性になっていることがわかります。
プログラムにすると、単純に
def rotate(a, b):
return [b, N-a+1]
となります。
2.座標と数字の変換
colが[0, 1, 3, 2]の場合
col[0] = 0 → 座標[1, 1]
col[1] = 1 → 座標[2, 2]
col[2] = 3 → 座標[3, 4]
col[3] = 2 → 座標[4, 3]
となっているのですから、これを一般化すると
col[i] = a ならば、 座標[i+1, a+1] にクイーンがあることを示しています。
逆に 座標[x, y]にクイーンがあることを示す場合は、
col[x-1] に y-1を代入すればよいことがわかります。
上記を使ってプログラムを考えてみましょう。
追記
上の説明でN=4の場合、下記のようなコードで変換できます。
N=4
# クイーンの位置を示す配列
test_col = [0,1,3,2]
# 回転前のクイーンの座標を格納する配列(初期化)
queens_place = [[0]*2 for i in range(N)]
# 回転後のクイーンの座標を格納する配列(初期化)
rotated_place = [[0]*2 for i in range(N)]
# 回転後のクイーンの座標に対応する数値を格納する配列(初期化)
rotated_col = [0 for i in range(N)]
def rotate(a, b):
'''
与えられた座標を左90度に回転した座標にして返す関数。
'''
return [b, N-a+1]
def coordinate_to_value(x, y):
'''
与えられた座標を数字に変換する関数。
返り値の1番目は配列のインデックス、2番目は配列の要素 を表す。
'''
return [x-1, y-1]
def value_to_coordinate(index, value):
'''
与えられたインデックスと数値を座標に変換する。
返り値の1番目はx座標、2番目はy座標 を表す。
'''
return [index+1, value + 1]
# 元のcol配列を、クイーンのx,y座標に変換してqueens_placeに格納する。
for index in range(N):
queens_place[index] = value_to_coordinate(index, test_col[index])
print("現在のクイーンの位置")
print(queens_place)
print()
# クイーンのx,y座標を左90度に回転したものをrotated_placeに格納する。
for index in range(N):
x = queens_place[index][0]
y = queens_place[index][1]
rotated_place[index]=rotate(x, y)
print("回転後のクイーンの位置")
print(rotated_place)
print()
# 回転後のクイーンのx,y座標を数字に直して配列にする。
for i in range(N):
index, value = coordinate_to_value(
rotated_place[i][0], # x座標
rotated_place[i][1] # y座標
)
rotated_col[index] = value
print("回転後の座標を数字に変換した後の答え")
print(rotated_col)
※詳しい方々へ:説明にそった形にするためかなり冗長で無駄なコードになっています。
タプルを使えとかnumpy使えばすぐできるとかいろいろあると思いますが、ご容赦ください。