社区讨论
求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 条回复,欢迎继续交流。
正在加载回复...