洛谷链接:https://www.luogu.com.cn/problem/P2802
import java.util.Scanner;
public class Main {
static int n=0,m=0,tx=0,ty=0,lx=0,ly=0,mou=6,times=0,minans=1<<30; //minans 1乘以2的30次方
static int[][] a=new int[11][11];
static int[] dx= {-1,1,0,0};
static int[] dy= {0,0,-1,1};
public static void dfs(int x,int y,int mou) {
//如果血量为0或者超出步数上界或者此时的步数已经超过了答案
if(mou==0 || times>m*n || times>minans) return;
if(a[x][y]==4) mou=6;
if(x==lx && y==ly) {
//如果到达终点
minans=Math.min(times, minans);
}else {
for(int i=0;i<4;i++) {
tx=x+dx[i];
ty=y+dy[i];
if(tx<=0 || tx>n || ty<=0 || ty>m || a[tx][ty]==0) continue; //边界判断和是否撞墙
times++;
dfs(tx,ty,mou-1);
times--; //回溯
}
}
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
m=in.nextInt();
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
a[i][j]=in.nextInt();
if(a[i][j]==2) { //记录开始点
tx=i;
ty=j;
}
if(a[i][j]==3) { //记录结束点
lx=i;
ly=j;
}
}
}
dfs(tx,ty,mou);
//如果此时 minans 与初值相等,则没有找到可行路径
if(minans!=1<<30) {
System.out.println(minans);
}else {
System.out.println("-1");
}
}
}