注意求最短路的时候用Bfs。
#include<iostream>
#include<stdio.h> using namespace std; int w,h,ex,ey,sx,sy; int map[100][100],can[100][100]; struct vid{ int x,y,step; }queue[5000]; int zan[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; int dirl[4][2]={0,-1,-1,0,0,1,1,0},dirr[4][2]={0,1,1,0,0,-1,-1,0}; int dfsr(int dstep,int x,int y,int di ) { int i,temp1,temp2; for(i=0;i<4;i++) { temp1=x+dirr[i][0]; temp2=y+dirr[i][1]; if((temp1>=0)&&(temp1<h)&&(temp2>=0)&&(temp2<w)) { if(dfsr(dstep+1,x+dirr[i][0],y+dirr[i][1],i)) return dstep; else return 0; } } return 0; } int dfsl(int dstep,int x,int y,int di ) { int i,temp1,temp2; for(i=0;i<4;i++) { temp1=x+dirl[i][0]; temp2=y+dirl[i][1]; if((temp1>=0)&&(temp1<h)&&(temp2>=0)&&(temp2<w)) { if(dfsl(dstep+1,temp1,temp2,i)) return dstep; else return 0; } } return 0; } int bfs() { if (sx == ex && sy == ey) { return 1; } int t,ww,x,y,t1,t2; t=ww=1; queue[t].x=sx; queue[t].y=sy; queue[t].step=0; can[sx][sy]=1; while(t<=ww&&!can[ex][ey]) { x=queue[t].x; y=queue[t].y; for(int i=0;i<4;i++) if((!map[x+zan[i][0]][y+zan[i][1]])&&(!can[x+zan[i][0]][y+zan[i][1]])) { t1=x+zan[i][0]; t2=y+zan[i][1]; if(t1>=0&&(t1<h)&&(t2>=0)&&(t2<w)&&(!map[t1][t2])&&(!can[t1][t2])) { queue[++ww].x=t1; queue[ww].y=t2; queue[ww].step=queue[t].step+1; can[t1][t2]=1; } } t++; } return queue[ww].step+1; } int main () { int t; char c; scanf("%d",&t); getchar(); while(t--) { scanf("%d%d",&w,&h); getchar(); for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { can[i][j]=0; c=getchar(); if(c=='#') map[i][j]=1; else if(c=='.') map[i][j]=0; else if(c=='S') { map[i][j]=0; sx=i,sy=j; } else if(c=='E') { map[i][j]=0; ex=i;ey=j; } } getchar(); } // init(); // dfsr(); // printf("%d ",bfs()); printf("%d %d %d\n",dfsl(0,sx,sy,0)+1,dfsr(0,sx,sy,0)+1,bfs()); } return 0; }