您好我想在2维(nxm)数组中找到循环。我在我的阵列中有n.m-1填充单元格,我想找到循环开始空单元格,继续填充单元格在空单元格中完成。
例如我们有这个数组;
我们的第一个周期是[0,0],[0,3],[2,3],[2,0] 第二个周期是[0,1],[0,3],[2,3],[2,2],[3,2],[3,1]
如何找到此数组中的所有循环。
感谢。
答案 0 :(得分:1)
我认为我的算法可以满足您的需求。
第一步是找到所有起点(这很容易),用你所在的点初始化一条路径,然后尝试从该点左,右,上或下跟踪一条路线。 / p>
public void start() {
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
if (array[y][x] == 0) {
int pos[] = {x,y};
path = new ArrayList<int[]>();
path.add(pos);
startx = x;
starty = y;
follow(x, y, 1, 0);
follow(x, y, -1, 0);
follow(x, y, 0, 1);
follow(x, y, 0, -1);
}
}
}
}
一旦你开始沿特定方向行驶路线,如果你再次到达起点,你就找到了一个循环,所以你无法输出你到达那里的路径而放弃任何进一步的搜索这条路线。
如果找到非空单元格,则需要将当前位置添加到路径历史记录中,然后尝试以与您所在方向成直角的方式递归跟随另一条路径。因此,如果您向左或向右,您现在只尝试向上或向下,反之亦然。
如果您的路线过了一条边而没有找到您的起点或非空单元格,那么您显然不会再进一步。
private void follow(int x, int y, int dx, int dy) {
x += dx;
y += dy;
while (x >= 0 && x < w && y >= 0 && y < h) {
if (x == startx && y == starty) {
for (int[] pos : path) {
System.out.printf("[%d,%d] ",pos[1], pos[0]);
}
System.out.printf("\n");
break;
}
if (array[y][x] != 0) {
int pos[] = {x,y};
path.add(pos);
if (dx != 0) {
follow(x, y, 0, 1);
follow(x, y, 0, -1);
}
else {
follow(x, y, 1, 0);
follow(x, y, -1, 0);
}
path.remove(path.size()-1);
}
x += dx;
y += dy;
}
}
Here's a full working example on ideone
我注意到这个算法存在一些问题,根据您的要求可能不适合您。