所以我试图制作一个在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;
}
答案 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;