首页 > 代码库 > soj 4396 bfs

soj 4396 bfs

背景:周赛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;
}



soj 4396 bfs