余杭普及 搜索1 H题Monsters(怪物)

题目:在n行m列的迷宫中躲避怪物,找到到达边界的路径。要在怪物事先知道路径的情况下,怪物用相同步数或更少步数能到达的都不能走。
所以要先把所有怪物塞到队列里,BFS搜一轮。在人搜一轮,避开怪物走过的地方。
要输出路径,可以在过程中存储,从结果开始入栈,倒推,在出栈输出。

struct xx{
	int x,y,step;
};
queue<xx> q1;
queue<xx> q2;
void ru(int ax,int ay){
	if(ax==sx&&ay==sy){
		return;
	}
	st.push(bj[ax][ay]);
	ru(ax-dx[bj[ax][ay]],ay-dy[bj[ax][ay]]);
}
void chu(){
	while(st.size()>0){
		cout<<c[st.top()];
		st.pop();
	}
}
void bfs(){
	int st=0;
	q2.push(xx{sx,sy,0});//q2是‘你’
	while(q2.size()>0){
		while(q1.size()>0){//q1是怪物,要提前把怪物位置存进q1
			xx now=q1.front();
			if(now.step!=st) break;//一次只搜一轮
			q1.pop();
			for(int i=0;i<4;i++){
				int nx=now.x+dx[i],ny=now.y+dy[i];
				if(dt[nx][ny]==1||v[nx][ny]==1) continue;//下标
				if(nx<0||ny<0||nx>=n||ny>=m) continue;
				v[nx][ny]=1;//标记,人不能走
				q1.push(xx{nx,ny,now.step+1});
			}
		}
		while(q2.size()>0){
			xx now=q2.front();
			if(now.step!=st) break;
			q2.pop();
			if(now.x==0||now.y==0||now.x==n-1||now.y==m-1){//到达边界
				cout<<"YES"<<endl<<now.step<<endl;
				ru(now.x,now.y);//入栈
				chu();//出栈
				return;
			}
			for(int i=0;i<4;i++){
				int nx=now.x+dx[i],ny=now.y+dy[i];
				if(dt[nx][ny]==1||v[nx][ny]==1) continue;
				v[nx][ny]=1;
				bj[nx][ny]=i;//存上一步方向 注意,dx和dy下标要和DULR对应
				q2.push(xx{nx,ny,now.step+1});
			}
		}
		st++;
	}
	cout<<"NO";
	return;
}
7 个赞

大佬,大哈的移动迷宫怎么做,巨弱不会=( (也是余杭普及)

2 个赞