思路

深度优先搜索,已搜索的进行标记

代码

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];
    }
}