python8皇後
❶ python中if __name__ == "__main__":的求問,這句話是true嗎,為什麼,代碼如圖,是八皇後問題代碼
__name__ == "__main__"
__name__ 是模塊的一個屬性,如果模塊是被執行的話, 那麼值為__main__,如果被導入的話那麼就是模塊名
❷ Python用迭代(yield)和遞歸解決八皇後問題
國際象棋的皇後行走具有最高的靈活性,可以橫、豎、斜共八個方向無限步行走。你需要將國際象棋8個皇後放在棋盤上,條件是任何一個皇後都不能威脅其他皇後,即任何兩個皇後都不能吃掉對方。
分析:在棋盤的第一行嘗試為第一個皇後選擇一個位置,再在第二行嘗試為第二個皇後選擇一個位置,依次類推。在發現無法為一個皇後選擇合適的位置後,回溯到前一個皇後,並嘗試為它選擇另一個位置。當八個皇後都放在棋盤上時即得到一種解。
用元組(其他序列也可以)表示可能的解(或一部分),例如(1,3,5)表示當前共擺放了三個皇後,第一個皇後在1行1列,第二個皇後在2行3列,第三個皇後在3行5列。
當前狀態state,下一個皇後在下一行的next_x位置,根據皇後的行走規則,如果已有的皇後可以吃掉下一個皇後,則表示有沖突,否則沒有。
函數conflict定義:接受用狀態元組表示的既有皇後的位置,並確定下一個皇後的位置是否會導致沖突。
參數 next_x 表示下一個皇後的水平位置(x 坐標,即列),而 next_y 為下一個皇後的垂直位置(y 坐標,即行)。這個函數對既有的每個皇後執行簡單的檢查:如果下一個皇後與當前皇後的 x 坐標相同或在同一條對角線上,將發生沖突,因此返回True ;如果沒有發生沖突,就返回False 。
abs(state[i] - next_x) in (0, next_y - i) 表示兩個皇後的水平距離為0或等於垂直距離時為真、否則為假。
❸ 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寫的源碼 謝謝
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))))
❺ python段錯誤,
http://blog.csdn.net/liangzhao_jay/article/details/47955079
❻ python關於八皇後判斷沖突函數的一些邏輯小問題
代碼確實不對false的返回位置不對,另外你的問題答案是在一條對角線說明兩點連接的斜率為1或負1,也就是橫坐標相減的絕對值等於縱坐標相減
❼ 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 8位怎麼表示
二進制,十進制。
答案python2.5及更早版本:可以使用int(01010101111,2)python2.5及更早版本:用noway來表示二進制文本。python2.6測試版:可以這樣做:0b1100111或0b1100111...python2.6測試版:也允許0o27或0o27(第二個字元是字母o)表示八進制。python3.0測試版:與2.6相同,但不再允許老版本027八進制的語法。
進制轉換:進制轉換是人們利用符號來計數的方法。進制轉換由一組數碼符號和兩個基本因素「基數」與「位權」構成。基數是指,進位計數制中所採用的數碼(數制中用來表示「量」的符號)的個數。位權是指,進位制中每一固定位置對應的單位值。簡單轉換理念:把二進制三位一組分開就是八進制,四位一組就是十六進制二。
❾ 求高手解八皇後問題(python)
pos是從0到num-1走的
pos=0時程序走這一段:
for result in queens(num, state + (pos,)):
yield (pos,) + result
就是先找第一個位置
❿ python 數字轉為8位二進制
defdec2bin(num):
l=[]
ifnum<0:
return'-'+dec2bin(abs(num))
whileTrue:
num,remainder=divmod(num,2)
l.append(str(remainder))
ifnum==0:
return''.join(l[::-1])
希望可以幫到你