Java 搜索二维数组

Java 搜索二维数组,java,algorithm,graph,Java,Algorithm,Graph,因此,我正在编写一个java程序,它应该能找到从入口“2”到其中一个数字“3”的最短路径。它只能在位置上行走“1”是墙 11111121 131 1 1 1 1111 1 1 13 1 1 1 11 1 1 1 1 1 1 11111111 我的出发点是在2d数组中找到入口。可以这样做: Point entrance = new Point(0,0); for (int i = 0; i < N; i++) { for (int

因此,我正在编写一个java程序,它应该能找到从入口
“2”
到其中一个数字
“3”
的最短路径。它只能在
位置上行走<代码>“1”
是墙

11111121 
131    1 
1 1 1111 
1 1 13 1     
1 1 11 1 
1 1    1
1      1  
11111111
我的出发点是在2d数组中找到入口。可以这样做:

Point entrance = new Point(0,0);
   for (int i = 0; i < N; i++) {
     for (int j = 0; j < N; j++){
        if(map[i][j] == 2){
           entrance.x =i;
           entrance.y =j;
        }
   }
点入口=新点(0,0);
对于(int i=0;i
我还可以找到两个
“3”
,并将它们保存在点中。但是我不知道如何将车辙返回到最接近的
“3”
。我像一个操纵杆一样考虑,在那里我保存你走的方向,比如(上、下、左、右)。 然后返回从入口到最接近点3的完整移动列表。
有什么建议或想法我可以如何实现这一点吗?

您需要制作一个计数器,每当当前位置为“”(可行走)时,计数器都会递增

矩阵中的符号
=
0

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

Point firstexit = new Point(0,0);
int steps = 0;
int i = entrance.x;
int j = entrance.y;
int lasti = 0;
int lastj = 0;
while(true){

    if(map[i][j] == 3){
       firstexit.x =i;
       firstexit.y =j;
       break ;
    }
    if(map[i][j] == 0){
       steps++;
    }

    // TO-DO : check if position exists
    if(map[i][j+1] == 0 && (lasti != i && lastj != j)){
       lastj = j;
       j++;
    }else if(map[i][j-1] == 0 && (lasti != i && lastj != j)){
       lastj = j;
       j--;
    }else if(map[i+1][j] == 0 && (lasti != i && lastj != j)){
       lasti = i;
       i++;
    }else if(map[i-1][j] == 0 && (lasti != i && lastj != j)){
       lasti = i;
       i--;
    }

}
点入口=新点(0,0);
对于(int i=0;i
这里所说的只是一个图的非管状表示。每个单元格都是图中的一个顶点,只有当且仅当两个相邻单元格都是自由的时,两个相邻单元格之间才有一条边


现在,以这种方式来看问题,像查找入口一样查找入口,然后使用a查找出口。

我将尝试创建一个包含节点和边的图形。节点是迷宫中的连接点,边是连接点与入口或出口对象之间的路径。每个边对象都有一个“权重”。从中计算网络后对于双数组,您可以使用一些简单的算法来计算最短路径。

请查看。提供了一个示例算法。您可以将其作为起点。我将研究该链接。在我尝试计算该链接时,我喜欢您的思维方式,但您不只是找到所有存在的位置吗“”aka.0.你应该只找到从入口到3的移动量。是的,你是对的,我在发布答案时才意识到这一点:),现在我正在考虑如何编辑它。我也在做同样的事情。如果你朝某个方向移动,我会尝试使用“步骤++;”。比如map[i-1][j]=左,map[i+1][j]=右,map[i][j-1]=向上和map[i][j+1]如果我得到了突破点,我会告诉你的。正是我所做的。我想是一样的。这不会奏效的。史蒂芬:s我很确定这必须更具体。我相信,要么从入口[x][y]坐标走,要么从出口[x][y]走。