搜索2d阵列

时间:2013-04-25 11:45:52

标签: 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 j = 0; j < N; j++){
        if(map[i][j] == 2){
           entrance.x =i;
           entrance.y =j;
        }
   }

我也可以找到两个"3"并将它们保存在分数中。 我不知道如何将rute返回到最近的"3"。我正在考虑像操纵杆,在那里我保存你去的方向,如(向上,向下,向左,向右)。 然后返回从入口到最近的3个移动的完整列表。 有任何建议或想法我如何实现这个?

3 个答案:

答案 0 :(得分:2)

这里有的只是图表的非规范表示。您将每个单元格作为图形中的顶点,并且当且仅当两个单元格都是空闲时,您才有两个相邻单元格之间的边缘。

现在您以这种方式查看问题,找到像您一样的入口,而不是breadth first search找到出口。

答案 1 :(得分:0)

你需要制作一个计数器,每当当前位置为“”(可行走)

时,它将递增

矩阵中的符号" " = 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--;
    }

}

答案 2 :(得分:0)

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