蒟蒻10分求调,玄关
查看原帖
蒟蒻10分求调,玄关
511939
封禁用户楼主2024/4/29 20:01
#include<bits/stdc++.h>
#define pii pair<int,int>
#define mp make_pair
using namespace std;
int n,f[105][105],seat[105],dis[105][105][105],num[105][105],p,r[105],c[105],sp[105],ca[105][105],used[105],out1[105],out2[105],out3[105];
int x[5]={0,0,0,1,-1};
int y[5]={0,1,-1,0,0};
queue<pii> q;
vector<int>G[105];
void bfs(int d,int a,int b){
	q.push(mp(a,b));
	dis[d][a][b]=0;
	while(!q.empty()){
		auto ed=q.front();
		q.pop();
		int xa=ed.first,xb=ed.second;
		for(int i=1;i<=4;i++){
			int na=xa+x[i],nb=xb+y[i];
			if(na>0&&nb>0&&na<=n&&nb<=n&&dis[d][na][nb]>dis[d][xa][xb]+1&&!f[na][nb]){
				dis[d][na][nb]=dis[d][xa][xb]+1;
				q.push(mp(na,nb));
			}
		}
	}
}
int dfs(int u){
	for(auto v:G[u]){
		if(used[v])continue;
		used[v]=1;
		if(!seat[v]||dfs(v)){
			seat[v]=u;
			return 1;
		}
	}
	return 0;
}
int main(){
	cin>>n;
	int cnt=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			char s;
			cin>>s;
			if(s=='*')f[i][j]=1;
			num[i][j]=++cnt;
		}
	}
	cin>>p;
	for(int i=1;i<=p;i++){
		cin>>r[i]>>c[i];
	}
	memset(dis,0x3f,sizeof(dis));
	for(int i=1;i<=p;i++){
		bfs(i,r[i],c[i]);
	}
	for(int i=1;i<=p;i++){
		cin>>sp[i];
	}
	int z;
	cin>>z;
	for(int i=1;i<=z;i++){
		int t1,x1,y1,j1;
		cin>>t1>>x1>>y1>>j1;
		for(int j=1;j<=p;j++){
			if(dis[j][x1][y1]>sp[j]*t1)ca[j1][j]=1;
		}
	}
	for(int i=1;i<=p;i++){
		for(int j=1;j<=p;j++){
			if(ca[i][j]==0)G[i].push_back(j);
		}
	}
	for(int i=1;i<=p;i++){
		memset(used,0,sizeof(used));
		dfs(i);
	}
	for(int i=1;i<=p;i++){
		out1[seat[i]]=i,out2[seat[i]]=r[i],out3[seat[i]]=c[i];
	}
	for(int i=1;i<=p;i++){
		cout<<seat[out1[i]]<<' '<<out2[i]<<' '<<out3[i]<<endl;
	}
	return 0;
}```
2024/4/29 20:01
加载中...