思路
深度优先搜索,已搜索的进行标记
代码
import java.io.BufferedInputStream;
import java.util.Scanner;
/**
* DFS搜索
* wmx
* 2022/3/1 23:43
*/
public class Main {
int[] startIdx;
int[] endIdx;
char[][] maze;
static char OBSTACLE = '#', START = 'S', END = 'E';
boolean[][] visited;
final static int[][] MOVE_OFFSET = new int[][]{{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
public static void main(String[] args) {
Scanner scan = new Scanner(new BufferedInputStream(System.in));
Main solution = new Main();
while (scan.hasNextInt()) {
int N = scan.nextInt();// 行数
int M = scan.nextInt();//列数
solution.maze = new char[N][M];
solution.visited = new boolean[N][M];
for (int i = 0; i < N; i++) {
String line = scan.next();
for (int j = 0; j < M; j++) {
solution.maze[i][j] = line.charAt(j);
if (START == solution.maze[i][j]) {
solution.startIdx = new int[]{i, j};
} else if (END == solution.maze[i][j]) {
solution.endIdx = new int[]{i, j};
}
}
}
System.out.println(solution.dfs(solution.startIdx[0], solution.startIdx[1]) ? "Yes" : "No");
}
}
// 能否从position到达终点
private boolean dfs(int i, int j) {
if (!validPosition(i, j)) {
return false;
}
if (i == endIdx[0] && j == endIdx[1]) {
return true;
}
visited[i][j] = true;
for (int[] offset : MOVE_OFFSET) {
if (dfs(i + offset[0], j + offset[1])) {
return true;
}
}
return false;
}
private boolean validPosition(int i, int j) {
return i >= 0 && i < maze.length && j >= 0 && j < maze[0].length && maze[i][j] != OBSTACLE && !visited[i][j];
}
}



京公网安备 11010502036488号