法一:
public class Main {
public static String[][] arr;
public static int[][] vis;
public static int n;
public static int m;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
arr = new String[100][100];//记录迷宫
vis = new int[100][100];//记录访问
n = scan.nextInt();//行
m = scan.nextInt();//列
int x=0, y=0;//S的位置
for(int i=0; i<n; i++) {
String str = scan.next();
for(int j=0; j<m; j++) {
arr[i][j] = str.charAt(j)+"";
if(arr[i][j].equals("S")){
x = i;
y = j;
}
}
}
if(dfs(x,y,0)) {
System.out.println("Yes");
}else {
System.out.println("No");
}
scan.close();
}
public static boolean dfs(int x, int y, int step){
if(arr[x][y].equals("T")) {
return true;
}
vis[x][y] = 1;
int[][] p = new int[][]{{-1, 0}, {0, -1}, {1,0},{0,1}};
for(int i=0; i<4; i++) {
int tx = x + p[i][0];
int ty = y + p[i][1];
if(in(tx, ty) && !arr[tx][ty].equals("*") && vis[tx][ty] !=1) {
if(dfs(tx, ty, step+1)) {
return true;
}
}
}
vis[x][y] = 0;
return false;
}
public static boolean in(int x, int y) {
if(x<0 || x>n-1 || y<0 || y>m-1) {
return false;
}
return true;
}
}
法二:
import java.util.Scanner;
import java.util.TreeSet;
import java.util.Arrays;
public class Main{
public static int m;//行
public static int n;//行
public static int startX;//开始行
public static int startY;//开始列
public static int endX;//结束行
public static int endY;//结束列
public static int minStep = 99999999;
public static int[][] map;
public static int[][] vis;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
m = scan.nextInt();
n = scan.nextInt();
map = new int[100][100];//0:可行 1:不可行
vis = new int[100][100];//0:未访问 1:已访问
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
map[i][j] = scan.nextInt();
}
}
startX = scan.nextInt();
startY = scan.nextInt();
endX = scan.nextInt();
endY = scan.nextInt();
vis[startX][startY] = 1;
dfs(startX, startY, 0);
System.out.println(minStep);
scan.close();
}
public static void dfs(int x, int y, int step) {
if(x==endX && y==endY){
minStep = Math.min(minStep, step);
return;
}
int[][] change = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
for (int i = 0; i < 4; i++) {
int tx = x + change[i][0];
int ty = y + change[i][1];
if(check(tx, ty) && vis[tx][ty] == 0 && map[tx][ty] == 0){
vis[tx][ty] = 1;
dfs(tx, ty, step+1);
vis[tx][ty] = 0;
}
}
return;
}
public static boolean check(int x, int y) {
if(x>-1 && x<m && y>-1 && y<n){
return true;
}
return false;
}
}