社区讨论

求卡常

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 条回复,欢迎继续交流。

正在加载回复...