我有一段我的代码片段,我在其中编写函数来检查女王放置的行,列和对角线,以便它们不会相互攻击。目前我遇到了对角函数的问题:
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
传递给函数答案 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
但请注意,我没有时间对此进行测试,因此可能会出现小错误,但总体思路应该是正确的。