在nqueen对角检查

时间:2017-05-20 06:34:10

标签: python n-queens

我有一段我的代码片段,我在其中编写函数来检查女王放置的行,列和对角线,以便它们不会相互攻击。目前我遇到了对角函数的问题:

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是我在代码中设置的部分解决方案。 X是女王的下一个可能位置,但输出中有一个X与女王明显对角并且会受到攻击。

部分解决方案列表= [6,0],在这种情况下,它将作为T

传递给函数

1 个答案:

答案 0 :(得分: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

但请注意,我没有时间对此进行测试,因此可能会出现小错误,但总体思路应该是正确的。