在二维数组中查找可用的“数字”

时间:2013-04-25 11:15:38

标签: java algorithm

我有这个问题,我需要以最有效的方式解决。 我有一个2d数组,其中包含以下内容: 1的所有东西都是“墙”,这意味着你无法通过它。 2是你输入数组或地图的入口,如果你愿意的话。 3是我们需要找到的东西。以下是地图示例:

1111111
1  3131
2 11111
1    31
1111111

这可能是我需要查看的数组的一个示例。正如您所看到的那样,有一个“无法访问,因为它被一个墙”1“包围。这意味着有两个可用数字这个数组。

首先我们需要找到入口。由于入口可以在任何地方我需要搜索整个阵列。我做了以下事情:

int treasureAmount = 0;
     Point entrance = new Point(0,0);
     for (int i = 0; i < N; i++) {
         for (int j = 0; j < N; i++){
             if(map[i][j] == 2){
                 entrance.x =i;
                 entrance.y =j;
             }

         }

这需要O(n ^ 2)时间,我真的没有看到另一种方法,因为入口可以在任何地方。 但是,我不确定如何有效和快速地找到可用的数字。我想在搜索数组的入口时,我会同时找到数组中的所有数字3,即使有些可能无法访问,之后我不确定如何有效地找到哪些是可访问的。

3 个答案:

答案 0 :(得分:2)

O(n ^ 2)你不能做得更好。读取阵列需要花费很多时间。但是,您可以进行深度优先搜索,以找到阵列中可达到的3#。这是伪代码。

main()
{
    read array and mark the entrance as ent.x and ent.y and also an array threex[] and threey[] that stores all the exit position.
    boolean visited[][]; //stores whether array[i][j] is reachable or not.
    dfs(ent.x,ent.y);
    for each element in three arrays
    {
        if(visited[threex[i]][threey[i]]) print ("Reachable");
        else print("not reachable", threex[i], threey[i]);
    }
}
int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; // dx[i], dy[i] tells whether to move in E,N,W,S respectively.
dfs(int x,int y)
{
    visited[x][y]=true;
    for(i=0;i<4;i++)//move in all directions
    {
        int newx=x+dx[i],newy=y+dy[i];
        //check if this is within the array boundary
        if(newx>=0&&newx<N && newy>=0&&newy<N)
        if(!visited[newx][newy] && array[newx][newy]!=1) // check if the node is unvisited and that it is pemissible
             dfs(newx,newy);
    }
}

由于每个数组元素在dfs函数中占用的次数不超过一次,因此代码的复杂度为O(n ^ 2)。

答案 1 :(得分:0)

创建数组时,可以保留一个值为2的坐标列表。您可以在O(n)中遍历该列表。

答案 2 :(得分:0)

由于入口和目标物品都可以在阵列中的任何位置,因此您没有多少选择,只能搜索所有内容。因此,您的入口搜索尽可能高效,对于目标项目,我建议使用maze flood fill algorithm

然而,该算法的链接版本有利于一个方向(就像它用水填充它,它淹没&#34;向下&#34;)。为了尽可能高效,你应该让它向各个方向扩展(就像你用气体填充它一样),例如:

            2
      1    212
0    101  21012
      1    212
            2

数字代表扩展的迭代。扩展是在四个方向进行的:左,右,上和下。当您到达目标项目时,您可以简单地通过回溯到迭代索引小于1的相邻单元格邻居来找到最短路径,直到返回到0迭代索引 - 入口。