对于每个位置,判断到达的步数是不是更小,大了就不处理,方法比较笨,不过也算是做出来了
import java.util.*; public class Main { Scanner sc=new Scanner(System.in); int[][] array; char[][] car; int n=0; int m=0; int b; int e; public void init() { while((n=sc.nextInt())!=0|(m=sc.nextInt())!=0) { car=new char[n][m]; array=new int[n][m]; b=0; e=0; for(int i=0;i<n;i++) { String s=sc.next(); if(s.indexOf('Y')!=-1) { b=i*m+s.indexOf('Y'); } if(s.indexOf('T')!=-1) { e=i*m+s.indexOf('T'); } car[i]=s.toCharArray(); Arrays.fill(array[i], 310); } array[b/m][b%m]=0; fun(b); if(array[e/m][e%m]==310) { System.out.println("-1"); } else { System.out.println(array[e/m][e%m]); } } } public void fun(int index) { if(index==e) { return; } int i=index/m; int j=index%m; if(i-1>=0) { if(car[i-1][j]!='S'&&car[i-1][j]!='R') { if(car[i-1][j]=='E'||car[i-1][j]=='T') { if(array[i][j]+1<array[i-1][j]) { array[i-1][j]=array[i][j]+1; fun((i-1)*m+j); } } if(car[i-1][j]=='B') { if(array[i][j]+2<array[i-1][j]) { array[i-1][j]=array[i][j]+2; fun((i-1)*m+j); } } } } if(i+1<n) { if(car[i+1][j]!='S'&&car[i+1][j]!='R') { if(car[i+1][j]=='E'||car[i+1][j]=='T') { if(array[i][j]+1<array[i+1][j]) { array[i+1][j]=array[i][j]+1; fun((i+1)*m+j); } } if(car[i+1][j]=='B') { if(array[i][j]+2<array[i+1][j]) { array[i+1][j]=array[i][j]+2; fun((i+1)*m+j); } } } } if(j-1>=0) { if(car[i][j-1]!='S'&&car[i][j-1]!='R') { if(car[i][j-1]=='E'||car[i][j-1]=='T') { if(array[i][j]+1<array[i][j-1]) { array[i][j-1]=array[i][j]+1; fun(i*m+j-1); } } if(car[i][j-1]=='B') { if(array[i][j]+2<array[i][j-1]) { array[i][j-1]=array[i][j]+2; fun(i*m+j-1); } } } } if(j+1<m) { if(car[i][j+1]!='S'&&car[i][j+1]!='R') { if(car[i][j+1]=='E'||car[i][j+1]=='T') { if(array[i][j]+1<array[i][j+1]) { array[i][j+1]=array[i][j]+1; fun(i*m+j+1); } } if(car[i][j+1]=='B') { if(array[i][j]+2<array[i][j+1]) { array[i][j+1]=array[i][j]+2; fun(i*m+j+1); } } } } } public static void main(String[] args) { // TODO 自动生成方法存根 new Main().init(); } }