背景:周赛h题。
学习:1.用queue写的bfs,主要注意的是,每一个生成后的子数据都要被标记为不能走了,否则将会越产生越多情况而超内存。
2.调试出现异常一定是代码问题,不要盲目以为编译器问题,认真一句一句的读代码查错为好。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
struct pal{
int x;
int y;
};
char map[202][202];
int main(void){
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d %d",&n,&m);
memset(map,'#',sizeof(map));
for(int i=0;i<n;i++) //read the map.
scanf("%s",map[i]);
queue<pal> q;
pal key,end;
int fq=0,sq=0; //fq mean the quantity of the father elemence of queue.
for(int i=0;i<n;i++){ //read the start and end place.
for(int j=0;j<m;j++){
if(map[i][j]=='m'){
key.x=i;
key.y=j;
q.push(key);
fq++;
}
if(map[i][j]=='p'){
end.x=i;
end.y=j;
}
}
}
int step=0;
int ways[4][2]={{1,0},{-1,0},{0,1},{0,-1}} ;
while(1){
if(q.front().x==end.x&&q.front().y==end.y) break;
for(int ii=0;ii<4;ii++) //make the front elemence walk to four directions.
{
if(q.front().x+ways[ii][0]>=0&&q.front().y+ways[ii][1]>=0&&(map[q.front().x+ways[ii][0]][q.front().y+ways[ii][1]]=='*'||map[q.front().x+ways[ii][0]][q.front().y+ways[ii][1]]=='p')){
key.x=q.front().x+ways[ii][0];
key.y=q.front().y+ways[ii][1];
map[key.x][key.y]='#'; //mark the son data,and avoid using it again.
q.push(key);
sq++;
}
}
fq--;
q.pop();
if(fq==0){
step++;
if(sq!=0){ //still have sons,so do the next.
fq=sq;
sq=0;
}else{
step=-1;
break;
}
}
}
printf("%d\n",step);
}
return 0;
}