八皇後python
⑴ python八皇後問題延伸求助
##請從下面的輸出找wxh。
import base64
print(base64.b64decode(b'5oiR55qE5b6u5L+h5Y+377yabWljcm9zb21l').decode(encoding="utf-8"))
⑵ 用python求解八皇後問題,本人知道八皇後的原理,只是看不懂python的輸出結果到底是何意
沒有見到你的代碼,不過從輸出看,估計是這個意思:
[0, 4, 7, 5, 2, 6, 1, 3]
總共八個數,表示0-7行所放皇後的位置。這就是一種解。這種表示只不過省略掉了行號,因為數字的本身所在位置就能表示行號了,可以節省存儲空間和讓數據看起來簡潔。編程中通常從0開始數起,而不是從1,估計你也是知道的。
轉化一下:
(0,0),(1,4),(2, 7),(3, 5),(4, 2),(5, 6),(6, 1),(7, 3)
這樣看可能就明白了吧,就是坐標了。
⑶ python解決八皇後演算法
global col #定義一些全局變數
global row
global pos_diag
global nag_diag
global count
def output():
''' 輸出一種有效結果
'''
global count
print row
count += 1
def do_queen(i):
''' 生成所有正確解
@param i: 皇後的數目
'''
for j in range(0, 8): #依次嘗試0~7位置
if col[j] == 1 and pos_diag[i-j+7] == 1 and nag_diag[i+j] == 1: #若該行,正對角線,負對角線上都沒有皇後,則放入i皇後
row[i] = j
col[j] = 0 #調整各個列表狀態
pos_diag[i-j+7] = 0
nag_diag[i+j] = 0
if i < 7:
do_queen(i+1) #可遞增或遞減
else:
output() #產生一個結果,輸出
col[j] = 1 #恢復各個列表狀態為之前的
pos_diag[i-j+7] = 1
nag_diag[i+j] = 1
if __name__ == '__main__':
col = [] #矩陣列的列表,存儲皇後所在列,若該列沒有皇後,則相應置為1,反之則0
row = [] #矩陣行的列表,存放每行皇後所在的列位置,隨著程序的執行,在不斷的變化中,之間輸出結果
pos_diag = [] #正對角線,i-j恆定,-7~0~7,並且b(i)+7統一到0~14
nag_diag = [] #負對角線,i+j恆定,0~14
count = 0
for index in range(0, 8): #一些初始化工作
col.append(1)
row.append(0)
for index in range(0, 15):
pos_diag.append(1)
nag_diag.append(1)
do_queen(0) #開始遞歸,先放一個,依次遞增,反過來,從7開始遞減也可
print 'Totally have %d solutions!' % count
輸出:
[0, 4, 7, 5, 2, 6, 1, 3]
[0, 5, 7, 2, 6, 3, 1, 4]
[0, 6, 3, 5, 7, 1, 4, 2]
[0, 6, 4, 7, 1, 3, 5, 2]
[1, 3, 5, 7, 2, 0, 6, 4]
[1, 4, 6, 0, 2, 7, 5, 3]
[1, 4, 6, 3, 0, 7, 5, 2]
[1, 5, 0, 6, 3, 7, 2, 4]
[1, 5, 7, 2, 0, 3, 6, 4]
[1, 6, 2, 5, 7, 4, 0, 3]
[1, 6, 4, 7, 0, 3, 5, 2]
[1, 7, 5, 0, 2, 4, 6, 3]
[2, 0, 6, 4, 7, 1, 3, 5]
[2, 4, 1, 7, 0, 6, 3, 5]
[2, 4, 1, 7, 5, 3, 6, 0]
[2, 4, 6, 0, 3, 1, 7, 5]
[2, 4, 7, 3, 0, 6, 1, 5]
[2, 5, 1, 4, 7, 0, 6, 3]
[2, 5, 1, 6, 0, 3, 7, 4]
[2, 5, 1, 6, 4, 0, 7, 3]
[2, 5, 3, 0, 7, 4, 6, 1]
[2, 5, 3, 1, 7, 4, 6, 0]
[2, 5, 7, 0, 3, 6, 4, 1]
[2, 5, 7, 0, 4, 6, 1, 3]
[2, 5, 7, 1, 3, 0, 6, 4]
[2, 6, 1, 7, 4, 0, 3, 5]
[2, 6, 1, 7, 5, 3, 0, 4]
[2, 7, 3, 6, 0, 5, 1, 4]
[3, 0, 4, 7, 1, 6, 2, 5]
[3, 0, 4, 7, 5, 2, 6, 1]
[3, 1, 4, 7, 5, 0, 2, 6]
[3, 1, 6, 2, 5, 7, 0, 4]
[3, 1, 6, 2, 5, 7, 4, 0]
[3, 1, 6, 4, 0, 7, 5, 2]
[3, 1, 7, 4, 6, 0, 2, 5]
[3, 1, 7, 5, 0, 2, 4, 6]
[3, 5, 0, 4, 1, 7, 2, 6]
[3, 5, 7, 1, 6, 0, 2, 4]
[3, 5, 7, 2, 0, 6, 4, 1]
[3, 6, 0, 7, 4, 1, 5, 2]
[3, 6, 2, 7, 1, 4, 0, 5]
[3, 6, 4, 1, 5, 0, 2, 7]
[3, 6, 4, 2, 0, 5, 7, 1]
[3, 7, 0, 2, 5, 1, 6, 4]
[3, 7, 0, 4, 6, 1, 5, 2]
[3, 7, 4, 2, 0, 6, 1, 5]
[4, 0, 3, 5, 7, 1, 6, 2]
[4, 0, 7, 3, 1, 6, 2, 5]
[4, 0, 7, 5, 2, 6, 1, 3]
[4, 1, 3, 5, 7, 2, 0, 6]
[4, 1, 3, 6, 2, 7, 5, 0]
[4, 1, 5, 0, 6, 3, 7, 2]
[4, 1, 7, 0, 3, 6, 2, 5]
[4, 2, 0, 5, 7, 1, 3, 6]
[4, 2, 0, 6, 1, 7, 5, 3]
[4, 2, 7, 3, 6, 0, 5, 1]
[4, 6, 0, 2, 7, 5, 3, 1]
[4, 6, 0, 3, 1, 7, 5, 2]
[4, 6, 1, 3, 7, 0, 2, 5]
[4, 6, 1, 5, 2, 0, 3, 7]
[4, 6, 1, 5, 2, 0, 7, 3]
[4, 6, 3, 0, 2, 7, 5, 1]
[4, 7, 3, 0, 2, 5, 1, 6]
[4, 7, 3, 0, 6, 1, 5, 2]
[5, 0, 4, 1, 7, 2, 6, 3]
[5, 1, 6, 0, 2, 4, 7, 3]
[5, 1, 6, 0, 3, 7, 4, 2]
[5, 2, 0, 6, 4, 7, 1, 3]
[5, 2, 0, 7, 3, 1, 6, 4]
[5, 2, 0, 7, 4, 1, 3, 6]
[5, 2, 4, 6, 0, 3, 1, 7]
[5, 2, 4, 7, 0, 3, 1, 6]
[5, 2, 6, 1, 3, 7, 0, 4]
[5, 2, 6, 1, 7, 4, 0, 3]
[5, 2, 6, 3, 0, 7, 1, 4]
[5, 3, 0, 4, 7, 1, 6, 2]
[5, 3, 1, 7, 4, 6, 0, 2]
[5, 3, 6, 0, 2, 4, 1, 7]
[5, 3, 6, 0, 7, 1, 4, 2]
[5, 7, 1, 3, 0, 6, 4, 2]
[6, 0, 2, 7, 5, 3, 1, 4]
[6, 1, 3, 0, 7, 4, 2, 5]
[6, 1, 5, 2, 0, 3, 7, 4]
[6, 2, 0, 5, 7, 4, 1, 3]
[6, 2, 7, 1, 4, 0, 5, 3]
[6, 3, 1, 4, 7, 0, 2, 5]
[6, 3, 1, 7, 5, 0, 2, 4]
[6, 4, 2, 0, 5, 7, 1, 3]
[7, 1, 3, 0, 6, 4, 2, 5]
[7, 1, 4, 2, 0, 6, 3, 5]
[7, 2, 0, 5, 1, 4, 6, 3]
[7, 3, 0, 2, 5, 1, 6, 4]
Totally have 92 solutions!
⑷ python八皇後問題是怎麼遞歸的求解
凡是線性回溯都可以歸結為右遞歸的形式,也即是二叉樹,因此對於只要求一個解的問題,採用右遞歸實現的程序要比回溯法要優美的多。
[py] view plain
def Test(queen,n):
'''''這個就不用說了吧,就是檢驗第n(下標,0-7)行皇後的位置是否合理'''
q=queen
for i in xrange(n):
if queen[i]==q or queen[i]-q==n-i or queen[i]-q==i-n:return False
return True
def Settle(queen,n):
'''''這個負責安置第n(下標,0-7)行皇後,每次調用,皇後都至少會移動一步'''
queen
+=1
while queen
<8 and not Test(queen,n):queen
+=1
return queen
<8
def Solve(queen,n):
'''''這個負責解決第n(下標,0-7)行皇後的安置以及隨後所有皇後的安置'''
if n==8:#安置完所有皇後了,故輸出列表
print queen
return True#如果設為假,則會嘗試所有的安置方案
else:
queen
=-1#初始化第n行皇後的起始位置(起始位置-1,可安置在0-7)
while Settle(queen,n):#如果成功安置皇後
if Solve(queen,n+1):#安置其餘皇後
return True#成功安置,返回真
return False#失敗,返回假
if __name__=='__main__':
Solve([-1 for i in range(8)],0)#列表的值可以隨便設置,因為會初始化
#雖然我們沒有進行回溯,但事實上,我們每一個參數相同的Solve函數都嘗試了多次
#輸出:[0, 4, 7, 5, 2, 6, 1, 3]
#比回溯法容易多了吧
⑸ 求高手解八皇後問題(python)
pos是從0到num-1走的
pos=0時程序走這一段:
for result in queens(num, state + (pos,)):
yield (pos,) + result
就是先找第一個位置
⑹ python八皇後問題 return
第一張圖,一旦if成立,立即終止循環,函數返回True,否則,一直到循環結束,如果if始終沒有成立,函數返回False。
第二張圖,一旦if成立,同樣終止循環,函數返回True;與第一張圖不同在於,如果if不成立,循環同樣會被下面的return False終止,函數返回False,也就是說,循環只執行一次就會被退出
⑺ python關於八皇後判斷沖突函數的一些邏輯小問題
代碼確實不對false的返回位置不對,另外你的問題答案是在一條對角線說明兩點連接的斜率為1或負1,也就是橫坐標相減的絕對值等於縱坐標相減
⑻ 八皇後 用Python寫的源碼 謝謝
import random
'''
設兩個不同的皇後分別在j,k行上,x[j],x[k]分別表示在j,k行的那一列上。
那麼不在同一對角線的條件可以寫為abs((j-k))!=abs(x[j]-x[k])
'''
def conflict(state,nextX):
nextY = len(state)
for i in range(nextY):
if abs(state[i]-nextX) in (0,nextY - 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 prettyprint(solution):
def line(pos,length=len(solution)):
return '.' * (pos) + 'X' + '.'*(length-pos-1)
for pos in solution:
print line(pos)
if __name__=="__main__":
prettyprint(random.choice(list(queens(8))))