算法1
注意:
① 参考: https://www.acwing.com/solution/content/14228/
② DFS用到递归,BFS用到队列。
③ 先创建队列,并添加头结点元素
④ while(!isEmpty()){ point = q.poll()}
⑤ 找到与point 相关的合适的点,遍历他们,并将他们加入到队列中,同时更新与点有关的路径信息。
public static int bfs(){
Queue<Pair> q = new LinkedList<>();
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 + row[i];
int y = pair.y + col[i];
if(x >=0 && x < n && y>=0 && y<m && map[x][y] == 0 &&d[x][y] == 0){
// 每次新加入一个点,就要更新与这个点相关的信息,这里是d[][] prev[][]
q.offer(new Pair(x, y));
d[x][y] = d[pair.x][pair.y] + 1;
prev[x][y] = pair;// 记录点(x,y)是有Pair走过来的。
}
}
}
}
// 完整代码
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 Pair[][] prev;
static int[][] map;
static int[][] d;// 走到当前点时走了多少步
static int n;
static int m;
static int[] row = {-1, 0, 1, 0};
static int[] col = {0, -1, 0, 1};
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.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];
for(int i = 0; i < n; i++){
String[] sb = br.readLine().split(" ");
for(int j = 0; j < m; j++)
map[i][j] = Integer.parseInt(sb[j]);
}
// 无需输入参数
System.out.print(bfs());
}
// bfs用到队列。先加入头结点,然后poll(),再向队列中添加相关元素。
public static int bfs(){
Queue<Pair> q = new LinkedList<>();
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 + row[i];
int y = pair.y + col[i];
if(x >=0 && x < n && y>=0 && y<m && map[x][y] == 0 &&d[x][y] == 0){
// 每次新加入一个点,就要更新与这个点相关的信息,这里是d[][] prev[][]
q.offer(new Pair(x, y));
d[x][y] = d[pair.x][pair.y] + 1;
prev[x][y] = pair;// 记录点(x,y)是有Pair走过来的。
}
}
}
}