#include<iostream> #include<cstdio> #include<queue> #include<bits/stdc++.h> using namespace std; int n,m; int c,b; struct Rou{ char pos; int x; int y; int step; }; bool isvis[500][500]; char a[500][500]; queue<Rou>q; int bfs(){ Rou first; first.x=c; first.y=b; first.step=0; first.pos='S'; q.push(first); isvis[first.x][first.y]=true; while(!q.empty()){ Rou cur=q.front(); q.pop(); if(cur.pos=='E'){ return cur.step; } else{ if(isvis[cur.x+1][cur.y]==false&&cur.x+1<=n&&a[cur.x+1][cur.y]!='#'){ Rou neighbor; neighbor.pos=a[cur.x+1][cur.y]; neighbor.step=cur.step+1; neighbor.x=cur.x+1; neighbor.y=cur.y+0; isvis[cur.x+1][cur.y]=true; q.push(neighbor); } if(isvis[cur.x][cur.y+1]==false&&cur.y+1<=m&&a[cur.x][cur.y+1]!='#'){ Rou neighbor; neighbor.pos=a[cur.x][cur.y+1]; neighbor.step=cur.step+1; neighbor.x=cur.x; neighbor.y=cur.y+1; isvis[cur.x][cur.y+1]=true; q.push(neighbor); } if(isvis[cur.x-1][cur.y]==false&&cur.x-1>=1&&a[cur.x-1][cur.y]!='#'){ Rou neighbor; neighbor.pos=a[cur.x-1][cur.y]; neighbor.step=cur.step+1; neighbor.x=cur.x-1; neighbor.y=cur.y+0; isvis[cur.x-1][cur.y]=true; q.push(neighbor); } if(isvis[cur.x][cur.y-1]==false&&cur.y-1>=1&&a[cur.x][cur.y-1]!='#'){ Rou neighbor; neighbor.pos=a[cur.x][cur.y-1]; neighbor.step=cur.step+1; neighbor.x=cur.x; neighbor.y=cur.y-1; isvis[cur.x][cur.y-1]=true; q.push(neighbor); } } } return 0; } int main(){ while(scanf("%d %d\n",&n,&m)!=EOF){ memset(isvis,false,sizeof(isvis)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%c",&a[i][j]); if(a[i][j]=='S'){ c=i; b=j; } } getchar(); } int ans=bfs(); printf("%d\n",ans); } } |
Double click to view unformatted code.