社区讨论
求卡常
P12684 【MX-J15-T4】叉叉学习魔法参与者 5已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mhjrpyhc
- 此快照首次捕获于
- 2025/11/04 07:25 4 个月前
- 此快照最后确认于
- 2025/11/04 07:25 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int mod=2e4;
int n,m,stx,sty,edx,edy,xx,yy,s,d;
int ans;
int dis[25000005];
bitset<25000005> vis;
char c[5002][5002];
int dx[]={1,0,0,-1,1,1,-1,-1},px;
int dy[]={0,1,-1,0,1,-1,1,-1},py;
struct node{
int to,val;
};
node p[25000005];
int siz,now,nxt;
inline void in(node x){
p[++siz]=x;
now=siz;
for(;now;){
nxt=now/2;
if(p[nxt].val<=p[now].val) break;
swap(p[nxt],p[now]);
now=nxt;
}
}
inline void out(){
swap(p[siz],p[1]);
siz--;
now=1;
for(;now*2<=siz;){
nxt=now*2;
if(nxt<siz&&p[nxt+1].val<p[nxt].val) nxt++;
if(p[nxt].val>=p[now].val) break;
swap(p[now],p[nxt]);
now=nxt;
}
}
void bfs(){
const int md=m;
in(node{stx*md-md+sty,0});
while(siz){
int rp=p[1].to;
out();
if(vis[rp]) continue;
vis[rp]=true;
for(register int i=4;i<8;i++){
s=rp-1;
xx=s/md+1,yy=s%md+1;
px=xx+dx[i];
py=yy+dy[i];
if(c[px][py]=='#') continue;
px=px*md-md+py;
d=dis[rp]+1;
if(d<dis[px]){
dis[px]=d;
in(node{px,dis[px]});
}
}for(register int i=0;i<4;i++){
s=rp-1;
xx=s/md+1,yy=s%md+1;
px=xx+dx[i];
py=yy+dy[i];
if(c[px][py]=='#') continue;
px=px*md-md+py;
d=dis[rp]+mod;
if(d<dis[px]){
dis[px]=d;
in(node{px,dis[px]});
}
}
}
}
int main(){
cin>>n>>m;getchar();
memset(c,'#',sizeof(c));
memset(dis,0x3f,sizeof(dis));
for(register int i=1;i<=n;i++){
for(register int j=1;j<=m;j++){
c[i][j]=getchar();
if(c[i][j]=='X') stx=i,sty=j;
if(c[i][j]=='W') edx=i,edy=j;
}
getchar();
}
dis[stx*m-m+sty]=0;
bfs();
ans=dis[edx*m-m+edy];
if(ans<=1e8) cout<<ans/mod<<' '<<ans%mod;
else cout<<"-1 -1";
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...