b站视频:
https://www.bilibili.com/video/BV16C4y1s7EF?t=1458
题目:求从起点走到终点的最短路径
输入:
行 列
地图( 1代表可走,2代表障碍物 )
起点坐标x,y
终点坐标x,y
样例:
输入
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
输出:
7
import java.awt.List;
import java.util.LinkedList;
import java.util.Scanner;
public class shortRoute {
static class node{ //定义每个方格
int x;//横坐标
int y;//纵坐标
int step;//从起点到达此方格的步数
public node(int x, int y, int step) {
this.x = x;
this.y = y;
this.step = step;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();//行
int m = in.nextInt();//列
int [][]map = new int[n+2][m+2];//地图 多定义两行方便处理数据
int [][]visit = new int[n+2][m+2];
//输入数据
for(int i = 1; i < n+1; i++)
for(int j = 1; j < m+1; j++)
map[i][j] = in.nextInt();
int startx = in.nextInt();
int starty = in.nextInt();
int endx = in.nextInt();
int endy = in.nextInt();
boolean flag = false;//用来判断最后是否有路劲
//方向
//右{0,1} 下{0,-1} 左 {-1,0} 上{1,0}
int []desx ={1,0,-1,0};
int []desy ={0,-1,0,1};
LinkedList<node> list = new LinkedList<node>();//创建队列
node start = new node(startx,starty, 0);//初始起点
list.add(start);//将起点放入队列中
while(list.size() != 0) {
//获取队首元素
int x = list.getFirst().x;
int y = list.getFirst().y;
int step = list.getFirst().step;
//判断是否到达终点
if ( x==endx && y==endy) {
System.out.println(step);
return;
}
//向4个方向扩展
for(int i=0; i<4; i++) {
int tx,ty;
tx = x + desx[i];
ty = y + desy[i];
//如果地图可走 并且未拜访过 就将此点加入队列
if( map[tx][ty] == 1 && visit[tx][ty] == 0) {
node temp = new node(tx,ty,step+1);
list.add(temp);
}
}
list.removeFirst();//移除队首
}
if(!flag)
System.out.println("无路径");
}
}