社区讨论

拼尽全力,无法战胜中模拟。

P4872OIer们的东方梦参与者 5已保存回复 8

讨论操作

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

当前回复
8 条
当前快照
1 份
快照标识符
@mhjhi52w
此快照首次捕获于
2025/11/04 02:39
4 个月前
此快照最后确认于
2025/11/04 02:39
4 个月前
查看原帖
rt,我是不是该退役了。
CPP
#include<bits/stdc++.h>
using namespace std;
char a[1005][1005];
int dis[1005][1005][2][2],n,m,sx,sy,dx[]={1,-1,0,0},dy[]={0,0,1,-1};
struct node{
    int x,y,f,s,w;
    bool friend operator<(node a,node b){
        return a.w>b.w;
    }
};
struct xy{int x,y;};
vector<xy>e;
priority_queue<node>q;
int main(){
    cin.tie(0)->sync_with_stdio(0);
    memset(dis,0x3f,sizeof dis);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(a[i][j]=='M')a[i][j]='0';
            if(a[i][j]=='S')sx=i,sy=j;
            if(a[i][j]=='X')e.push_back({i,j});
        }
    dis[sx][sy][0][0]=0;
    q.push({sx,sy,0,0,0});
    while(!q.empty()){
        auto [x,y,f,s,w]=q.top();q.pop();
        if(w>dis[x][y][f][s])continue;
        if(a[x][y]=='E'){cout<<w;exit(0);}
        for(int i=0;i<4;i++){
            int xx=x+dx[i],yy=y+dy[i];
            if(xx<1||xx>n||yy<1||yy>m)continue;
            
            if(a[xx][yy]=='0'||a[xx][yy]=='E'){
                if(dis[xx][yy][f][s]>w+1)
                    dis[xx][yy][f][s]=w+1,q.push({xx,yy,f,s,w+1});
            }
            else if(a[xx][yy]=='4'){
                if(dis[xx][yy][1][s]>w+1)
                    dis[xx][yy][1][s]=w+1,q.push({xx,yy,1,s,w+1});
            }
            else if(a[xx][yy]=='2'){
                int cost=(f||s)?1:4;
                if(dis[xx][yy][f][s]>w+cost)
                    dis[xx][yy][f][s]=w+cost,q.push({xx,yy,f,s,w+cost});
            }
            else if(a[xx][yy]=='3'){
                int cost=(f||s)?1:9;
                if(dis[xx][yy][f][s]>w+cost)
                    dis[xx][yy][f][s]=w+cost,q.push({xx,yy,f,s,w+cost});
            }
            else if(a[xx][yy]=='5'){
                if(dis[xx][yy][f][1]>w+6)
                    dis[xx][yy][f][1]=w+6,q.push({xx,yy,f,1,w+6});
                if(dis[xx][yy][f][s]>w+1)
                    dis[xx][yy][f][s]=w+1,q.push({xx,yy,f,s,w+1});
            }
            else if(a[xx][yy]=='1'&&s){
                if(dis[xx][yy][f][s]>w+1)
                    dis[xx][yy][f][s]=w+1,q.push({xx,yy,f,s,w+1});
            }
            else if(a[xx][yy]=='X'){
                if(dis[xx][yy][f][s]>w+1)
                    dis[xx][yy][f][s]=w+1,q.push({xx,yy,f,s,w+1});
                if(e.size()>1)
                    for(auto [tx,ty]:e)
                        if((tx!=xx||ty!=yy)&&dis[tx][ty][f][s]>w+2)
                            dis[tx][ty][f][s]=w+2,q.push({tx,ty,f,s,w+2});
            }
        }
    }
    cout<<"We want to live in the TouHou World forever";
}

回复

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

正在加载回复...