【算法分析】
广搜,迷宫问题模板题。
广搜使用队列这一数据结构。首先起点位置入队,而后每次出队一个位置,将该位置可以到达的所有与之相邻的位置入队,同时记录行走步数。如果到达终点位置,输出到达终点时的步数即为从起点到终点的最短距离。
假设地图中有n个格子,广搜的复杂度为O ( n )
【参考代码】
cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int m[202][202],p[400000][4];
int xx[4]={-1,1,0,0};
int yy[4]={0,0,-1,1};
int t,r,c,x1,y1;
char ch;
void bfs(){
int x,y,t=0,w=1;
while(w>t){
t++;
for(int i=0;i<4;i++){ //上下左右四个方向搜索
x=p[t][1]+xx[i];
y=p[t][2]+yy[i];
if(x>0&&x<=r&&y>0&&y<=c&&m[x][y]==0){ //如果坐标在范围内且没访问过
w++;
p[w][1]=x;
p[w][2]=y;
p[w][3]=p[t][3]+1;
m[x][y]=1;
if(x==x1&&y==y1){
printf("%d\n",p[w][3]);return;
}
}
}
}
printf("oop!\n");
}
int main()
{
scanf("%d",&t);
for(int k=1;k<=t;k++){
scanf("%d %d",&r,&c);
memset(m,0,sizeof(m));
memset(p,0,sizeof(p));
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++){
cin>>ch;
if(ch=='S'){
m[i][j]=1;p[1][1]=i,p[1][2]=j,p[1][3]=0;
//如果字符等于s,map标记为1表示已访问过, p[1][1]=i表示队列第一个元素的x坐标为i
//p[1][2]=j表示队列第一个元素的y坐标为j, p[1][3]=0示队列第一个元素的单位时间为0
}
else if(ch=='E'){ //x1,y1表示结束的坐标
x1=i;
y1=j;
}
else if(ch=='#') m[i][j]=1; //如果字符等于#,map标记为1表示已访问过
}
bfs();
}
return 0;
}