在 nqueen 中对角检查

Checking diagonally in 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是我在代码中设置的部分解。 X是皇后的下一个可能位置,但输出中有一个X明显与皇后成对角线,将被攻击。

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

传递给函数

两个点(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

不过要小心,我没有时间测试这个,所以可能会有一些小错误,但总体思路应该是正确的。