AcWing 844. 走迷宫 java 代码,输出路径以及路径长度
原题链接
简单
作者:
study
,
2020-06-04 13:02:44
,
所有人可见
,
阅读 3725
java 代码,输出路径以及路径长度
import java.util.*;
import java.io.*;
//存储路径
class Pair {
int x;
int y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
//地图
static int[][] map = null;
//保存走过的路,数组d的元素表示当前走了多少步
//当没有走过的话,则该值为0
static int[][] d = null;
//用于记录当前位置是从之前哪个位置过来的,便于输出路径
static Pair[][] prev = null;
static int n;
static int m;
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(in);
String[] nums = br.readLine().split(" ");
n = Integer.parseInt(nums[0]);
m = Integer.parseInt(nums[1]);
map = new int[n][m];
d = new int[n][m];
prev = new Pair[n][m];
//迷宫map
for(int i = 0; i < n; i++) {
String[] inputs = br.readLine().split(" ");
for (int j = 0; j < m; j++) {
map[i][j] = Integer.parseInt(inputs[j]);
}
}
System.out.println(bfs());
}
public static int bfs() {
//初始化队列
Queue<Pair> q = new LinkedList<Pair>();
int[] dy = {0, 1, 0, -1}, dx = {-1, 0, 1, 0};
//加入起点0, 0
q.offer(new Pair(0, 0));
while (!q.isEmpty()) {
Pair pair = q.poll();
if (pair.x == n - 1 && pair.y == m - 1) {
break;
}
//上左下右 遍历
for (int i = 0; i < 4; i++) {
int x = pair.x + dx[i];
int y = pair.y + dy[i];
if (x >= 0 && x < n && y >= 0 && y < m && map[x][y] == 0 && d[x][y] == 0) {
q.offer(new Pair(x, y));
d[x][y] = d[pair.x][pair.y] + 1;
//存储能到当前x,y的位置
prev[x][y] = pair;
}
}
}
//从终点往前遍历到起点
int x = n - 1, y = m - 1;
while (x != 0 || y != 0) {
System.out.println(x + " " + y);
//prev[x][y] 存储的是能到达当前位置的位置
Pair tmp = prev[x][y];
x = tmp.x;
y = tmp.y;
}
return d[n - 1][m - 1];
}
}
为什么vector[HTML_REMOVED] q;就会报错
PII q[N * N];这样才可以啊,我不理解这个是为什么,原则上不都是可以的吗?
“从终点遍历到起点” 这个是什么意思?
这里面没有对d数组进行任何操作,是不是可以直接省略这步,直接return?
我明白了,这是输出路径
只是题目没要求而已。。。
d初始化应该是全部赋值为-1 然后起始点为0,后面如果为-1才加入队列,你这样还是会搜到起始点,虽然结果没问题。
怎么说,大佬,Java有类似memset这样的函数吗
我感觉没啥问题啊,只要保证起始点d[0][0]=0不就行了吗,后面搜的点都是在前一个点距离+1操作,所以初始化为0还是-1没区别吧
Arrays.fill()
大佬 不太理解这句话呢d[x][y] = d[pair.x][pair.y] + 1;
pair是进行位移之前的点,现在我们要求的是进行位移之后的点的路径长度,所以就是上一步位移时的点对应的位移加1
下一个点到起点的距离为上一个搜索到的点到起点的距离+1
上右下左
输入部分学习了