Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从二维阵列中的一个点增加相邻单元_Java_Arrays_Algorithm_Path_Increment - Fatal编程技术网

Java 如何从二维阵列中的一个点增加相邻单元

Java 如何从二维阵列中的一个点增加相邻单元,java,arrays,algorithm,path,increment,Java,Arrays,Algorithm,Path,Increment,我试图使Lee算法的实现更加高效,到目前为止,我正在使用一个立方循环来增加2D整数数组中的相邻单元格: for(int k = 1; k < g.length*2; ++k){ for(int i = x0-k; i < x1+k; ++i) for(int j = y0-k; j < x1+k; ++j) { if(i > 0

我试图使Lee算法的实现更加高效,到目前为止,我正在使用一个立方循环来增加2D整数数组中的相邻单元格:

        for(int k = 1; k < g.length*2; ++k){
            for(int i = x0-k; i < x1+k; ++i)
                for(int j = y0-k; j < x1+k; ++j)
                {
                    if(i > 0 && j > 0 && i < g.length-1 && j < g.length-1)
                    {
                        if(g[x1][y1] != 0)
                            return true;    
                        if(g[i][j] == k && g[i+1][j] == 0){
                            g[i+1][j] = k + 1;
                        }
                        if(g[i][j] == k && g[i][j+1] == 0){
                            g[i][j+1] = k + 1;
                        }
                        if(g[i][j] == k && g[i-1][j] == 0){
                            g[i-1][j] = k + 1;
                        }
                        if(g[i][j] == k && g[i][j-1] == 0){
                            g[i][j-1] = k + 1;
                        }
                    }
                }
        }

是否有一种更快的方法来填充网格,同时检查值?

我对该算法知之甚少,但一些资料建议您选择起点作为距离图形中心最远的点

我运行了您的示例,并在开头添加了以下代码:

if (d2 > d1) {
    startRow = startRow ^ endRow;
    endRow = startRow ^ endRow;
    startRow = startRow ^ endRow;

    startCol = startCol ^ endCol;
    endCol = startCol ^ endCol;
    startCol = startCol ^ endCol;
}
其中,
d2
d1
分别是从终点和起点到中心的距离

我计时了100多万次,速度提高了约20%


他们建议的另一种选择是同时从起点和终点扇出-但我不确定其停止条件是什么(因为目标将从代码中的1开始)。

无论何时访问
g
数组,例如
g[I][j]
,发动机罩下有两个。如果边界检查失败,将抛出
java.lang.IndexOutOfBoundsException

您可以将边界检查的数量减少一半

您可以使用简单的1D数组
g[W*H]
,而不是使用2D数组
g[W*H]

然后,不用写
g[i][j]
,你可以写
g[i*W+j]
x0
y0
是起始单元格?是的,x0,y0是起始单元格x1,y1是目标单元格如果我停止递增,这肯定是我可以做的,以改善当前循环,然而,我正在寻找一些东西来完全取代立方环。我得到了一些提示,可以使用数组列表来完成,但是我不知道怎么做。@user2266341我不确定这是否有意义-数组列表基本上只是一个动态数组。阵列是否会有任何边界(不可交叉点)?我不确定他所说的“存储波前”到底是什么意思。在我看来,波阵面是一个递增整数的前值,但我不知道他存储它是什么意思。@user2266341我想你可能想澄清一下,他说的是时间效率还是空间效率。
if (d2 > d1) {
    startRow = startRow ^ endRow;
    endRow = startRow ^ endRow;
    startRow = startRow ^ endRow;

    startCol = startCol ^ endCol;
    endCol = startCol ^ endCol;
    startCol = startCol ^ endCol;
}