BFS——献给阿尔吉侬的花束
输入样例:
3 3 4 .S.. ###. ..E. 3 4 .S.. .E.. .... 3 4 .S.. #### ..E.
我的题解:
#include<bits/stdc++.h> #define x first #define y second using namespace std; int n,m; char s[220][220]; int dis[220][220]; typedef pair<int,int> PII; int dx[]={1,0,0,-1}; int dy[]={0,-1,1,0}; int bfs(PII start,PII end) { queue<PII> q; q.push(start); memset(dis,-1,sizeof dis); dis[start.x][start.y]=0; while(q.size()) { PII t = q.front(); q.pop(); for(int i=0;i<4;i++) { int x = t.x+dx[i], y = t.y +dy[i]; if(x<0||x>=n||y<0||y>=m) continue;//出界 if(s[x][y]=='#') continue;//障碍物 if(dis[x][y]!=-1) continue;//已经遍历过了 dis[x][y]=dis[t.x][t.y]+1; if(end == make_pair(x,y)) return dis[x][y]; q.push({x,y}); } } return -1; } int main() { int T; cin>>T; while(T--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",s[i]); PII start ,end; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(s[i][j]=='E') end={i,j}; else if (s[i][j]=='S') start ={i,j}; } } int res = bfs(start ,end); if(res ==-1) printf("oop!\n"); else printf("%d\n",res); } }
标准题解: