2017-05-20 66 views
0

我有我的代碼片段,我寫了函數來檢查皇后放置的行,列和對角線,以便它們不會互相攻擊。目前,我在與對角線功能問題:在對角檢查nqueen

def checkDiagonal(T): 
for i in range(len(T) - 1): 
    if abs(T[i] - T[i + 1]) == 1: 
     return False 
return True 

具有這種功能的問題是,它只會考慮當皇后是一個長度分開,但不是在案件不止一個。

實施例中,如果N = 7它打印:

Enter the value of N: 7 
0 Q 0 0 0 0 0 
0 0 0 0 0 0 0 
0 0 X 0 0 0 0 
0 0 X 0 0 0 0 
0 0 X 0 0 0 0 
0 0 X 0 0 0 0 
Q 0 0 0 0 0 0 

在輸出的Q是部分解i的代碼集。 X是女王的下一個可能的位置,但輸出中有一個X與女王明顯對角,並且會受到攻擊。

偏溶液列表= [6,0],在這種情況下,它將傳遞給函數爲T

+0

輸入參數'T'應該是什麼? – JohanL

+0

@JohanL部分解決方案列表[6,0] – Electric

+0

你怎麼知道你正在測試的是什麼樣的'X'位置?或者你想測試它們嗎?在那種情況下,'N'會很好。 – JohanL

回答

0

兩點(x1, y1)(x2, y2)是一個相同的左下 - >右上對角線當且僅當y1 - x1 == y2 - x2。 如果我理解你的問題正確,部分解決方案T = [0,6]將代表部分解決方案[(0,0), (1,6)]。所以,由於0 - 0 = 0 != 5 == 6 - 1,這兩個元素不在同一個對角線上。

然而,對於局部溶液[0 , 6, 2] = [(0,0), (1,6), (2,2)]我們將有0 - 0 == 0 == 2 - 2,因此兩點將是對同一左下 - >右上對角線。

對於左上角 - >右下對角線,您必須找到類似的情況,我認爲您應該能夠弄清楚,但是如果您無法找到它,請告訴我。

這將導致類似的代碼(僅適用於該對角線):

def checkDiagonal(T): 
    for i in xrange(len(T) - 1): 
     for j in xrange(i + 1, len(T)) 
      if ((T[i] - i == T[j] - j): 
       return false 
    return true 

然而小心,我沒有時間來測試這一點,所以有可能在它很小的錯誤,但總的想法應該是正確的。