分别求出每次遇到叉路向左、向右和最短路的长,用dfs和bfs模拟,写的很长,也懒的简化了
#include<queue> #include<iostream> using namespace std; int a[50][50]= {0}; int w,h,cnt; struct Coor { int i,j; } start,end; int dfsr(int i,int j,int d) { if(i==end.i&&j==end.j) return cnt; cnt++; switch(d) { case 1: if(a[i][j+1]==-1) dfsr(i,j+1,4); else if(a[i-1][j]==-1) dfsr(i-1,j,1); else if(a[i][j-1]==-1) dfsr(i,j-1,3); else if(a[i+1][j]==-1) dfsr(i+1,j,2); break; case 2: if(a[i][j-1]==-1) dfsr(i,j-1,3); else if(a[i+1][j]==-1) dfsr(i+1,j,2); else if(a[i][j+1]==-1) dfsr(i,j+1,4); else if(a[i-1][j]==-1) dfsr(i-1,j,1); break; case 4: if(a[i+1][j]==-1) dfsr(i+1,j,2); else if(a[i][j+1]==-1) dfsr(i,j+1,4); else if(a[i-1][j]==-1) dfsr(i-1,j,1); else if(a[i][j-1]==-1) dfsr(i,j-1,3); break; case 3: if(a[i-1][j]==-1) dfsr(i-1,j,1); else if(a[i][j-1]==-1) dfsr(i,j-1,3); else if(a[i+1][j]==-1) dfsr(i+1,j,2); else if(a[i][j+1]==-1) dfsr(i,j+1,4); break; } } int dfsl(int i,int j,int d) { if(i==end.i&&j==end.j) return cnt; cnt++; switch(d) { case 1: if(a[i][j-1]==-1) dfsl(i,j-1,3); else if(a[i-1][j]==-1) dfsl(i-1,j,1); else if(a[i][j+1]==-1) dfsl(i,j+1,4); else if(a[i+1][j]==-1) dfsl(i+1,j,2); break; case 2: if(a[i][j+1]==-1) dfsl(i,j+1,4); else if(a[i+1][j]==-1) dfsl(i+1,j,2); else if(a[i][j-1]==-1) dfsl(i,j-1,3); else if(a[i-1][j]==-1) dfsl(i-1,j,1); break; case 3: if(a[i+1][j]==-1) dfsl(i+1,j,2); else if(a[i][j-1]==-1) dfsl(i,j-1,3); else if(a[i-1][j]==-1) dfsl(i-1,j,1); else if(a[i][j+1]==-1) dfsl(i,j+1,4); break; case 4: if(a[i-1][j]==-1) dfsl(i-1,j,1); else if(a[i][j+1]==-1) dfsl(i,j+1,4); else if(a[i+1][j]==-1) dfsl(i+1,j,2); else if(a[i][j-1]==-1) dfsl(i,j-1,3); break; } } int bfs() { queue<int> q; q.push(start.i*100+start.j); while(a[end.i][end.j]==-1) { int i=q.front()/100; int j=q.front()%100; if(a[i-1][j]==-1) { q.push((i-1)*100+j); a[i-1][j]=a[i][j]+1; } if(a[i+1][j]==-1) { q.push((i+1)*100+j); a[i+1][j]=a[i][j]+1; } if(a[i][j-1]==-1) { q.push(i*100+j-1); a[i][j-1]=a[i][j]+1; } if(a[i][j+1]==-1) { q.push(i*100+j+1); a[i][j+1]=a[i][j]+1; } q.pop(); } return a[end.i][end.j]; } int main() { int n; cin>>n; while(n--) { cin>>w>>h; for(int i=1; i<=h; i++) for(int j=1; j<=w; j++) { char tmp; cin>>tmp; switch (tmp) { case '#': a[i][j]=0; break; case '.': a[i][j]=-1; break; case 'S': a[i][j]=1; start.i=i; start.j=j; break; case 'E': a[i][j]=-1; end.i=i; end.j=j; break; } } cnt=1; int left=dfsl(start.i,start.j,1); cout<<left<<" "; cnt=1; int right=dfsr(start.i,start.j,1); cout<<right<<" "; cout<<bfs()<<endl; } }