题目链接:
https://www.acwing.com/problem/content/1103/
题解:
!!!
要么在bfs内部定义queue,要么每次在进入bfs时将queue清空!
!!!
AC代码:#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#define x first
#define y second
using namespace std;
typedef pair<int ,int> PII;
int T;
int r, c;
const int N = 205;
char g[N][N];
int st[N][N];
int bfs(PII start,PII end){
//坑!
queue<PII> q;
q.push(start);
st[start.x][start.y] = 0;
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
while(!q.empty()){
PII now = q.front();
q.pop();
// (-1,0) (1,0) (0,-1) (0,1)
for(int i=0;i<4;i++){
int nx = now.x+dx[i];
int ny = now.y+dy[i];
if(nx < 0 || nx >= r || ny < 0 || ny >= c) continue;
if(st[nx][ny] != -1) continue;
if(g[nx][ny] == 'E'){
return st[now.x][now.y]+1;
}
if(g[nx][ny] == '#') continue;
q.push(make_pair(nx,ny));
st[nx][ny] = st[now.x][now.y]+1;
}
}
return -1;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&r,&c);
for(int i=0;i<r;i++) scanf("%s",g[i]);
PII s,e;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
if(g[i][j] == 'S'){
s = make_pair(i,j);
}
if(g[i][j] == 'E'){
e = make_pair(i,j);
}
}
// fill(st,st+N*N,-1);
memset(st,-1, sizeof(st));
int res = bfs(s,e);
if(res == -1) printf("oop!\n");
else printf("%d\n",res);
}
return 0;
}
来源:https://www.cnblogs.com/doubest/p/12378892.html