根据题目描述,你需要输入网格的大小、起点和终点坐标,以及网格中障碍物的情况。然后计算从起点到终点的最少移动次数。
思路分析:
- 首先判断终点是否为障碍物,如果是则直接返回 -1。
- 初始化一个二维数组
vis
用于标记每个位置是否被搜索过,初始值为 -1。 - 创建一个队列
queue
存储待搜索的位置。 - 将起点加入队列,并将起点的标记设为 0。
- 在队列不为空的情况下,循环执行以下步骤:
- 弹出队首元素,获取当前位置的坐标。
- 在上、下、左、右四个方向上搜索可达的位置:
- 如果位置合法且未被搜索过且为可行路径('.'):
- 将该位置加入队列。
- 更新该位置的标记为当前位置标记加 1。
- 如果该位置为终点,则返回从起点到该位置的步数。
- 如果位置合法且未被搜索过且为可行路径('.'):
- 如果队列为空仍未找到终点,则返回 -1。
public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); m = sc.nextInt(); arrs = new char[n + 1][m + 1]; vis = new int[n + 1][m + 1]; x1 = sc.nextInt();y1 = sc.nextInt(); x2 = sc.nextInt();y2 = sc.nextInt(); for (int i = 1; i <= n; i++) { String temp = sc.next(); for (int j = 1; j <= m; j++) { arrs[i][j] = temp.charAt(j - 1); } } System.out.println(bfs()); } private static int bfs() { if (arrs[x2][y2] == '*') return -1; //1.标记刚开始每个位置都没有搜索过 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { vis[i][j] = -1; } } Queue<int[]> queue = new LinkedList<>();//队列 //2.起点加入队列 queue.add(new int[]{x1,y1}); vis[x1][y1] = 0;//初始化起点 while(!queue.isEmpty()){ int[] t = queue.poll(); int a = t[0],b = t[1]; for (int i = 0; i < 4; i++) {//上下左右四个方向搜索 int x = a + dx[i]; int y = b + dy[i];//坐标 if (x >= 1 && x <= n && y >= 1 && y <= m && vis[x][y] == -1 && arrs[x][y] == '.'){ queue.add(new int[]{x,y}); vis[x][y] = vis[a][b] + 1; if (x == x2 && y == y2) return vis[x][y]; } } } return -1; }