求助,最后一个点tle其他全ac了
查看原帖
求助,最后一个点tle其他全ac了
1086825
davidhuangRDF楼主2025/1/30 17:26

附上评测记录:https://www.luogu.com.cn/record/200856755

#include<bits/stdc++.h>
using namespace std;
int main(){
	cin.tie(0)->sync_with_stdio(0);
	int n,m;
	cin>>n>>m;
	vector<int>mp(16390);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c;
			cin>>c;
			if(c=='O'){
				mp[(i-1)*m+j]=1;
			}
		}
	}

	int a,b,c,d;
	vector<int>dx={0,-m+1,1,1+m,m,m-1,-1,-1-m,-m};
	
	
	while(cin>>a>>b>>c>>d&&a){
		vector<int>pd(16390,0),vis(16390,0); 
		function<bool(int,int)>init=[&](int k,int x){
//			cout<<k<<':'<<endl;
			while(mp[x]&&x){
				
//				cout<<x<<endl;
				pd[x]=1;
				
				if(((x+dx[k])-1)/m>=n||x+dx[k]<1||(k<4&&x%m==0)||(k>4&&k!=8&&x%m==1)){
					break;
				}
				x+=dx[k];
			}
			return 1;
		};
		
		for(int i=1;i<=8;i++){
			init(i,((a-1)*m+b));
		}
//		for(int i=1;i<=n*m;i++){
//			cout<<pd[i];
//		} 
//		cout<<(a-1)*m+b<<endl;
		queue<tuple<int,int>>q;
		vis[(c-1)*m+d]=1;
		q.push({(c-1)*m+d,0});
		bool f=1;
		vector<int>di={0,1,m,-1,-m};
		while(!q.empty()){
			auto [x,z]=q.front();
			q.pop();
			if(pd[x]){
				cout<<z<<endl;
				f=0;
				break;
			}
			for(int i=1;i<=4;i++){
				int nx=x+di[i];
				if(!mp[nx]||vis[nx]){
					continue;
				}
				if((nx-1)/m>=n||nx<1||(i==1&&x%m==0)||(i==3&&x%m==1)){
					continue;
				}
				q.push({nx,z+1});
				vis[nx]=1;
			}
		}
		if(f){
			cout<<"Poor Harry"<<endl;
		}
	}
}
2025/1/30 17:26
加载中...