背景:周赛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; }
时间: 2024-10-10 00:34:05