在 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
不过要小心,我没有时间测试这个,所以可能会有一些小错误,但总体思路应该是正确的。
我有一段代码,我在其中编写函数来检查皇后放置的行、列和对角线,这样它们就不会互相攻击。目前我对角函数有问题:
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
不过要小心,我没有时间测试这个,所以可能会有一些小错误,但总体思路应该是正确的。