C# 在二维数组中寻找循环

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] 如何查找此数组中的所有周期 谢谢。我想我有一个算法可以满足您的需要 第一步是找到所有的起点(这很容易),用你所处的点初始化一条路径,然后尝试从该点开始沿着一条路线向左、向右、向上或向下

嗨,我想在二维(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

我注意到这个算法存在一些问题,根据您的需求,这些问题可能并不适合您

  • 实际上,每条路径都有两个版本-一个遵循顺时针方向,另一个显然是逆时针方向
  • 有些道路交叉在自己的路线上。例如,类似于8字形的图案。我不知道你是否会接受这是一个有效的周期

  • 虽然答案很好,但我的反对票是支持OP,没有显示出任何努力。所以这不是为了解决问题,而是为了帮助。