社区讨论

玄关求调p2199

P2199最后的迷宫参与者 1已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjtiqyp
此快照首次捕获于
2025/11/04 08:15
4 个月前
此快照最后确认于
2025/11/04 08:15
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+5;
int n,m,fx,fy,ex,ey,dx[8]={-1,0,0,1,-1,-1,1,1},dy[8]={0,-1,1,0,-1,1,-1,1},ans;
char mp[N];
bool bj[N],vis[N];
struct node{
	int x,y,sv;
};
int id(int x,int y){
	return (x-1)*m+y;
}
void init(int x,int y){
	bj[id(x,y)]=1;
	for(int i=0;i<8;i++){
		int tx=x,ty=y;
		while(mp[id(tx+dx[i],ty+dy[i])]=='O'){
			bj[id(tx+dx[i],ty+dy[i])]=1;
			tx+=dx[i],ty+=dy[i];
		}
	}
}
bool bfs(int x,int y){
	queue<node> q;
	q.push({x,y,0});
	vis[id(x,y)]=1;
	while(!q.empty()){
		node p=q.front();
		q.pop();
		if(bj[id(p.x,p.y)]){
			ans=p.sv;
			return true;
		}
		for(int i=0;i<4;i++){
			int xx=p.x+dx[i],yy=p.y+dy[i];
			int t=id(xx,yy);
			if(!vis[t]&&mp[t]=='O'){
				vis[t]=1;
				q.push({xx,yy,p.sv+1}); 
			}
		} 
	}
	return false;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n*m;i++){
		cin>>mp[i];
	}
	while(1){
		memset(bj,0,sizeof(bj));
		memset(vis,0,sizeof(vis));
		cin>>ex>>ey>>fx>>fy;
		if(fx==0){
			break;
		}
		init(ex,ey);
		if(bfs(fx,fy)){
			cout<<ans<<endl;
		}
		else{
			cout<<"Poor Harry"<<endl;
		}
	}
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...