2018年1月7日 星期日

b039: 最終兵器X



 西元2185年,地球人終於有能力征服其他有生物的星球,不過卻受到該星球生物的反擊。於是科學家們發明了一種「最終兵器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 . 
>>> 

沒有留言:

張貼留言

WOKWI DHT22 & LED , Node-Red + SQLite database

 WOKWI DHT22 & LED , Node-Red + SQLite database Node-Red程式 [{"id":"6f0240353e534bbd","type":"comment&...