我的问题非常类似于八个女王之谜。
我有二维数组(N x N),例如,如下所示:
0,0,0,0,1 y
0,0,0,0,0 |
0,0,0,0,0 V
0,0,0,1,0
0,0,0,0,0
x->
我正在水平,垂直和对角检查是否出现1
\,0,|,0,/
0,\,|,/,0
-,-,1,-,-
0,/,|,\,0
/,0,|,0,\
我正在考虑只在列表中存储“1”的(x,y)位置
[[4,0],[3,3]]
并以数学方式求解,检查“1”的每个位置与另一个(x1,y1)< - >(x2,y2),
如果x1 == x2
或y1 == y2
we have a collision!
,则检查:
x2 == x1 + z;
y2 == y1 + z;
x2 == x1 - z;
y2 == y1 - z;
(???)
其中z为+/- ( x1+z in 0..N ) and ( y1+z in 0..N ) .......
我的问题是检查对角线碰撞,有更好的方法吗?
答案 0 :(得分:20)
一种可能的解决方案:
def collision(x1, y1, x2, y2):
return x1 == x2 or y1 == y2 or abs(x1-x2) == abs(y1-y2)
即。如果两个点位于同一水平行,相同垂直行或相同对角线(垂直距离==水平距离),则会发生碰撞。
答案 1 :(得分:2)
您的描述听起来像一个确切的封面问题的实例,可以使用Knuth调用Algorithm X的算法来解决。我使用这种技术实现了Sudoku solver in Javascript。您也可以在Python中找到实现。
答案 2 :(得分:0)
我认为如果你没有用数学方法解决它会快得多,但首先检查所有行的多次出现1s,然后是所有列,最后是所有对角线。
以下是一些以简单方式测试对角线的代码。 (这是JavaScript,对不起!)
var count = 0;
for (column = -n; column < n; column++) {
for (row = 0; row < n; row++) {
// conditions for which there are no valid coordinates.
if (column + row > 6) {
break;
}
if (column < 0) {
continue;
if (field[row][column] == 1) {
count++;
if (count == 2)
break; // collision
}
}
}
此方法的复杂度为O(n^2)
,而您建议的方法的复杂度为O(n^2 + k^2)
(k为1的数量)如果k
总是很小,则应该是没问题。
答案 3 :(得分:0)
假设你确实有一个你可能没有的N维空间,你可以使用这个碰撞探测器:
def collision(t1, t2):
return len(set([abs(a-b) for a,b in zip(t1, t2)] + [0])) <= 2
将一对元组传递给你喜欢的任何元素,如果这两个点位于任何N维对角线上,它将返回true。