1. 程式人生 > >Python使用元組+遞迴簡單解決八皇后問題

Python使用元組+遞迴簡單解決八皇后問題

一、基本思想是用元素進入元組的先後表明行號,具體數值表明列號,註釋很清楚了就不再說明,直接貼程式碼了

import time
def yesnot(state,nextX):                            # 判斷下一個皇后在當前狀態下時候可放
    nextY = len(state)                              #存放已經放了幾行
    for i in range(nextY):                          #測試當前皇后與之前的是否衝突
        if abs(nextX - state[i]) in (0,nextY - i):  #abs(nextX - state[i])表明橫向距離,in(0,nextY - i)表示0或extY - i,0表明在同一列上,(nextY - i)表明在斜線上只要一個相等返回錯誤
            return False
    return True                                     #若未返回錯誤則新位置可放皇后,返回正確

def queen(state,num):
    for i in range(num):                            #遍歷尋找可以放的地點
        if yesnot(state, i):                        #判斷i點時候和以往皇后是否衝突
            if len(state) == num - 1:               #如果皇后數量時候已滿
                print(state + (i,))                 #滿足條件新增到元組並輸出
            else:
                queen(state + (i,), num)            #不衝突把新的皇后位置新增到元組進行遞迴

t = time.time()                                     #程式開始時間
queen((),8)                                         #執行八皇后問題,8是皇后數
t2 = time.time()                                    #程式結束時間
print(t2-t)                                         #程式執行時間

三、我的程式執行12皇后時python版耗時13~14s,java版耗時400ms左右,不知道為什麼相同程式碼python耗時遠高於java,如果有大佬知道歡迎指導。我知道python執行會慢一些但是沒想到慢這麼多,如果30或者50,100皇后會有多大差距呢?