所以我正在写一个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个移动的完整列表。
有任何建议或想法我如何实现这个?
答案 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)
我会尝试创建一个包含节点和边的图。节点是迷宫中的交汇点,边缘是交汇点和入口或出口对象之间的路径。每个边缘对象都有一个“权重”。一旦从双数组计算网络,就可以使用一些简单的算法来计算出最短路径。