西元2185年,地球人終於有能力征服其他有生物的星球,不過卻受到該星球生物的反擊。於是科學家們發明了一種「最終兵器X」(如下圖),它能自動攻擊左上、上、右上、右、右下、下、左下、左等八個方向的敵人,只要在地圖上放上幾台,就可以不費吹灰之力消滅敵人。
不過很不幸地,它也會把另一台最終兵器X當做是敵人,因此必須精準計算它們的位置,以免它們互相攻擊到對方。經過數學家仔細地計算,發現一個 NxN 的地圖上,最多可以放 N 台最終兵器X,而且每一列只能放一台,你能幫他們找出來怎麼放比較適合嗎?
不過很不幸地,它也會把另一台最終兵器X當做是敵人,因此必須精準計算它們的位置,以免它們互相攻擊到對方。經過數學家仔細地計算,發現一個 NxN 的地圖上,最多可以放 N 台最終兵器X,而且每一列只能放一台,你能幫他們找出來怎麼放比較適合嗎?
輸入說明:
輸入一個正整數 N (4<=N<=12),代表要放 N 台的最終兵器X。
輸出說明:
請輸出每種可能的排法,因為每列只能放一個,故只要輸出每列的最終兵器X是放在第幾行就可以了,請依序輸出第一列、第二列、…第N列的位置。
範例輸入:
4
範例輸出 :
2 4 1 3 3 1 4 2
import random
#隨機模組
def conflict(state,col):
#衝突函數,row為行,col為列
row=len(state)
for i in range(row):
if abs(state[i]-col) in (0,row-i):#重要語句
return True
return False
def queens(num ,state=()):
#生成器函數
for pos in range(num):
if not conflict(state, pos):
if len(state)==num-1:
yield(pos,)
else:
for result in queens(num, state+(pos,)):
yield (pos,)+result
def queenprint(solution):
#列印函數
def line(pos,length=len(solution)):
return '. '*(pos)+'X '+'. '*(length-pos-1)
for pos in solution:
print (line(pos))
print("輸入一個正整數 N (4<=N<=12),代表要放 N 台的最終兵器X。")
N=int(input())
for solution in list(queens(N)):
print (solution)
print ()
print ( ' total number is '+str(len(list(queens(N)))))
print ( ' one of the range is:\n')
queenprint(random.choice(list(queens(N))))
===================== RESTART: F:/Python_APSC/b039-3.py =====================
輸入一個正整數 N (4<=N<=12),代表要放 N 台的最終兵器X。
4
(1, 3, 0, 2)
(2, 0, 3, 1)
total number is 2
one of the range is:
. X . .
. . . X
X . . .
. . X .
>>>
沒有留言:
張貼留言