Java在NxN网格中查找完整路由

时间:2014-10-17 15:04:46

标签: java algorithm recursion

所以我试图制作一个在NxN网格中查找完整路径的算法。例如,在1x1网格中有1个可能的路径,在2x2网格中有1个,在3x3中有2个,在4x4中有8个。想法是找到我们可以通过移动来填充网格的每个点的场景。

我为这份工作做了一个递归函数,这里是代码:

public static int getRoutesHelp(int[][] table, int x, int y)
    {

        if(x > table.length-1 || x < 0 || y < 0 || y > table.length-1)
            return 0;

        if(table[x][y] == 1)
            return 0;

        table[x][y] = 1;

        if(isDeadEnd(table, x, y))
        {
            if(isTableFull(table))
                return 1;

        }
        else
        {
            int a = getRoutesHelp(table, x-1, y);
            int d = getRoutesHelp(table, x, y+1);
            int b = getRoutesHelp(table, x+1, y);
            int c = getRoutesHelp(table, x, y-1);
            return a+b+c+d;
        }

        return 0;
    }

    public static int getRoutes(int size)
    {
        int[][] table = new int[size][size];

        // init table

        for(int i = 0; i < size; i++)
        {
            for(int a = 0; a < size; a++)
            {
                table[i][a] = 0;
            }
        }


        return getRoutesHelp(table, 0 ,0);
    }

所以基本上我从0.0开始并开始向所有可能的方向移动并重复这一点,我获得了成功路线的数量。问题是在分配int d之后,原始表以某种方式填充了1,但据我所知它应该是空的,因为java传递了表的副本吗?我一直在与这个争斗4个小时,并没有真正找到问题所以任何帮助表示赞赏。表中的空插槽标记为0,填充插槽标记为1。

编辑:我设法解决了复制问题,现在我的另一个问题是,使用5x5网格,我的算法返回52条路线,它应该是86.所以它适用于4x4网格好的,但是一旦我进一步移动就会中断。

在这里添加了isDeadEnd函数

public static boolean isDeadEnd(int[][] table, int x, int y)
    {

        int toCheck[] = new int[4];
        toCheck[0] = x-1; // left
        toCheck[1] = y-1; // top
        toCheck[2] = x+1; // right
        toCheck[3] = y+1; // bottom

        int valuesOfDirections[] = new int[4]; // left, top, right, bottom

        for(int i = 0; i < 4; i++)
        {
            int tarkastettava = toCheck[i];
            if(tarkastettava > table.length-1 || tarkastettava < 0)
            {
                valuesOfDirections[i] = 1;
            }
            else
            {
                if(i == 0 || i == 2)
                {
                    valuesOfDirections[i] = table[tarkastettava][y];
                }
                else
                {
                    valuesOfDirections[i] = table[x][tarkastettava];
                }
            }
        }

        for(int i = 0; i < 4; i++)
        {
            if(valuesOfDirections[i] == 0)
            {
                return false;
            }
        }

        return true;

    }

1 个答案:

答案 0 :(得分:0)

想想看,你可能会在这里做一个简单的回溯:

table[x][y] = 1;

if(isDeadEnd(table, x, y)) {
    if(isTableFull(table))
        return 1;
    }
    table[x][y] = 0;
}

后来:

int res = a + b + c + d;
if (res == 0) {
    // backtrack here too
    table[x][y] = 0;
}
return res;