检查二维数组(如八个皇后拼图)

时间:2008-12-21 20:00:55

标签: python arrays puzzle

我的问题非常类似于八个女王之谜。

我有二维数组(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 == x2y1 == 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 ) .......

我的问题是检查对角线碰撞,有更好的方法吗?

4 个答案:

答案 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。