社区讨论
拼尽全力,无法战胜中模拟。
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 条回复,欢迎继续交流。
正在加载回复...