C# 在二维数组中寻找循环
嗨,我想在二维(nxm)数组中查找循环。我的数组中有n.m-1个填充单元格,我想找到循环开始的空单元格,在填充单元格中继续,在空单元格中结束 例如,我们有这个数组 我们的第一个周期是[0,0],[0,3],[2,3],[2,0] 第二个循环是[0,1],[0,3],[2,3],[2,2],[3,2],[3,1] 如何查找此数组中的所有周期C# 在二维数组中寻找循环,c#,java,algorithm,cycle,C#,Java,Algorithm,Cycle,嗨,我想在二维(nxm)数组中查找循环。我的数组中有n.m-1个填充单元格,我想找到循环开始的空单元格,在填充单元格中继续,在空单元格中结束 例如,我们有这个数组 我们的第一个周期是[0,0],[0,3],[2,3],[2,0] 第二个循环是[0,1],[0,3],[2,3],[2,2],[3,2],[3,1] 如何查找此数组中的所有周期 谢谢。我想我有一个算法可以满足您的需要 第一步是找到所有的起点(这很容易),用你所处的点初始化一条路径,然后尝试从该点开始沿着一条路线向左、向右、向上或向下
谢谢。我想我有一个算法可以满足您的需要 第一步是找到所有的起点(这很容易),用你所处的点初始化一条路径,然后尝试从该点开始沿着一条路线向左、向右、向上或向下走
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);
}
}
}
}
public void start(){
对于(int y=0;y
一旦你开始沿着一个特定的方向走一条路线,如果你再次到达你的起点,你就找到了一个循环,因此你不能输出你到达那里的路径,也不能放弃沿着这条路线的任何进一步搜索
如果发现非空单元格,则需要将当前位置添加到路径历史记录中,然后尝试以与所在方向成直角的方式递归地沿着另一条路径。所以,如果你向左或向右,你现在只尝试向上或向下,反之亦然
如果你的路线经过一个边缘,却找不到起点或非空单元格,那么你显然不能再往前走了
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;
}
}
private void follow(int x,int y,int dx,int dy){
x+=dx;
y+=dy;
而(x>=0&&x=0&&y
我注意到这个算法存在一些问题,根据您的需求,这些问题可能并不适合您
虽然答案很好,但我的反对票是支持OP,没有显示出任何努力。所以这不是为了解决问题,而是为了帮助。