社区讨论

求Hack

P4442[COCI 2017/2018 #3] Portal参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhj250j7
此快照首次捕获于
2025/11/03 19:29
4 个月前
此快照最后确认于
2025/11/03 19:29
4 个月前
查看原帖
如题
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans=INT_MAX;
char str[505][505];
int Sx,Sy,Tx,Ty;
struct node{
	int tim,x,y;
};
queue<node> q;
struct N{
	int x,y;
}a[505][505][4];
int fx[]={0,1,0,-1},
	fy[]={1,0,-1,0};
int vis[505][505];
int sol(int x,int y){
	int res=INT_MAX;
	for(int i=0;i<4;i++){
		res=min(res,abs(x-a[x][y][i].x)+abs(y-a[x][y][i].y));
	}
	return res;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>str[i][j];
			if(str[i][j]=='C') Sx=i,Sy=j;
			if(str[i][j]=='F') Tx=i,Ty=j;
			vis[i][j]=INT_MAX; 
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(str[i][j]=='.'||str[i][j]=='C'||str[i][j]=='F'){
				for(int k=i-1;k>=1;k--){
					if(str[k][j]=='#'){
						a[i][j][0].x=k+1;
						a[i][j][0].y=j;
						break;
					}
				}
				for(int k=i+1;k<=n;k++){
					if(str[k][j]=='#'){
						a[i][j][1].x=k-1;
						a[i][j][1].y=j;
						break;
					}
				}
				for(int k=j-1;k>=1;k--){
					if(str[i][k]=='#'){
						a[i][j][2].x=i;
						a[i][j][2].y=k+1;
						break;
					}
				}
				for(int k=j+1;k<=m;k++){
					if(str[i][k]=='#'){
						a[i][j][3].x=i;
						a[i][j][3].y=k-1;
						break;
					}
				}
			}
		}
	}
	q.push({0,Sx,Sy});
	vis[Sx][Sy]=0;
	while(!q.empty()){
		node f=q.front();
		q.pop();
		int tim=f.tim,x=f.x,y=f.y;
		if(x==Tx&&y==Ty){
			ans=min(ans,tim);
			continue;
		}
		if(tim>vis[x][y]) continue;
		bool bz=1;
		int t=sol(x,y)+tim+1;
		for(int i=0;i<4;i++){
			int dx=x+fx[i];
			int dy=y+fy[i];
			if(str[dx][dy]!='#'&&vis[dx][dy]>tim+1){
				vis[dx][dy]=tim+1;
				q.push({tim+1,dx,dy});
			}
			
			if(bz){
				dx=a[x][y][i].x,dy=a[x][y][i].y;
				if(vis[dx][dy]<=t) continue;
				vis[dx][dy]=t;
				q.push({t,dx,dy});
			}
		}
	}
	if(ans==INT_MAX) printf("nemoguce\n");
	else printf("%lld\n",ans);
	return 0;
}

回复

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

正在加载回复...