起点为start,由dx[]与dy[]控制像上下左右走
每走一步会产生几种新的状态,把他压入队列中,再下一次循环中继续走 每次用加一 用dist记录步数
(在广搜情况下 每种状态都会走一步之后产生的下一种状态后,才轮到下一种状态走下一步 )
因此如果有i==n&&j==m就代表有一种状态达到了(n,m)那么这就是最短距离
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#define N 210
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
char g[N][N];
int dist[N][N];
int m,n;
int bfs(PII start,PII end)
{
queue<PII> q;
memset(dist , -1 , sizeof dist);
dist[start.x][start.y] = 0;
q.push(start);
int dx[] = {-1,0,1,0} , dy[] = {0,1,0,-1};
while(q.size())
{
PII t = q.front();
q.pop();
for(int i = 0;i < 4;i ++)
{
int a = t.x + dx[i] , b = t.y + dy[i];
if(a < 0 || a >= n || b < 0 || b >= m || g[a][b] == '#')// 排除不符合条件的情况
continue;
if(dist[a][b] != -1)//不能对a[1][1]重复赋值 一旦重新赋值结果全为0
continue;
dist[a][b] = dist[t.x][t.y] + 1;
if(end == make_pair(a,b))
return dist[a][b];
q.push({a,b});//产生状态压入队列
}
}
return -1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i = 0;i < n;i ++) scanf("%s",g[i]);
PII start,end;
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
if(g[i][j] == 'S') start = {i,j};
else if(g[i][j] == 'E') end = {i,j};
//用二元组记录起点与终点
int distance = bfs(start, end);
if(distance == -1) puts("oop!");
else printf("%d\n",distance);
}
return 0;
}