社区讨论

悬赏求条·2关,有部分注释

P10485Bloxorz I参与者 1已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mjrzpedq
此快照首次捕获于
2025/12/30 10:50
2 个月前
此快照最后确认于
2025/12/30 11:29
2 个月前
查看原帖
球球了。
CPP
#include<bits/stdc++.h>
// #define int long long
#define I cout<<"Impossible";
using namespace std;
const int N=510,INF=INT_MAX;
struct tt{
    int x,y,xx,yy,cnt,d;
    // d=1/2
    // x,y,xx,yy坐标
    // cnt答案
};
int n,m,x,y,xx,yy,xxx,yyy,d,ans;
map<pair<int,int>,map<pair<int,int>,bool>> mp;
// 标记按行小大列小大排序
char a[N][N];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void Clear(){
    mp.clear();
    x=-1;
    y=-1;
    xx=-1;
    yy=-1;
    xxx=-1;
    yyy=-1;
    ans=INF;
}
void bfs(){
    if(x>xx){
        swap(x,xx);
        swap(y,yy);
    }
    else if(x==xx){
        if(y>yy){
            swap(y,yy);
        }
    }
    queue<tt> q;
    q.push({x,y,xx,yy,0,d});
    mp[{x,y}][{xx,yy}]=1;
    // 坐标-1为没有
    while(!q.empty()){
        tt t=q.front();
        q.pop();
        if(t.xx==xxx&&t.yy==yyy&&t.x==-1&&t.y==-1){
            ans=t.cnt;
            return;
        }
        if(t.d==1){
            for(int i=0;i<4;i++){
                int sx=t.xx+dx[i],sy=t.yy+dy[i],sxx=t.xx+dx[i]*2,syy=t.yy+dy[i]*2;
                if(sx>sxx){
                    swap(sx,sxx);
                    swap(sy,syy);
                }
                else if(sx==sxx){
                    if(sy>syy){
                        swap(sy,syy);
                    }
                }
                if(sx>=1&&sx<=n&&sy>=1&&sy<=m&&sxx>=1&&sxx<=n&&syy>=1&&syy<=m&&!(a[sx][sy]=='#'&&a[sxx][syy]=='#')&&mp[{sx,sy}][{sxx,syy}]==0){
                    mp[{sx,sy}][{sxx,syy}]=1;
                    q.push({sx,sy,sxx,syy,t.cnt+1,2});
                }
            }
        }
        else{
            if(t.x==t.xx){
                // 横
                int sy=t.y-1;
                if(sy>=1&&sy<=m&&mp[{-1,-1}][{t.x,sy}]==0&&a[t.x][sy]!='#'&&a[t.x][sy]!='E'){
                    mp[{-1,-1}][{t.x,sy}]=1;
                    q.push({-1,-1,t.x,sy,t.cnt+1,1});
                }
                sy=t.yy+1;
                if(sy>=1&&sy<=m&&mp[{-1,-1}][{t.x,sy}]==0&&a[t.x][sy]!='#'&&a[t.x][sy]!='E'){
                    mp[{-1,-1}][{t.x,sy}]=1;
                    q.push({-1,-1,t.x,sy,t.cnt+1,1});
                }
                int sx=t.x-1;
                if(sx>=1&&sx<=n&&mp[{sx,t.y}][{sx,t.yy}]==0&&!(a[sx][t.y]==a[sx][t.yy]&&a[sx][t.y]=='#')){
                    mp[{sx,t.y}][{sx,t.yy}]=1;
                    q.push({sx,t.y,sx,t.yy,t.cnt+1,2});
                }
                sx=t.x+1;
                if(sx>=1&&sx<=n&&mp[{sx,t.y}][{sx,t.yy}]==0&&!(a[sx][t.y]==a[sx][t.yy]&&a[sx][t.y]=='#')){
                    mp[{sx,t.y}][{sx,t.yy}]=1;
                    q.push({sx,t.y,sx,t.yy,t.cnt+1,2});
                }
            }
            else{
                // 竖
                /*
                X
                X
                 ___
                /__/|  ______
                |  || /_____/|
                |__|/ |_____|/
                */
                int sx=t.xx+1;
                if(sx>=1&&sx<=n&&mp[{-1,-1}][{sx,t.y}]==0&&a[sx][t.y]!='#'&&a[sx][t.y]!='E'){
                    mp[{-1,-1}][{sx,t.y}]=1;
                    q.push({-1,-1,sx,t.y,t.cnt+1,1});
                }
                sx=t.xx-1;
                if(sx>=1&&sx<=n&&mp[{-1,-1}][{sx,t.y}]==0&&a[sx][t.y]!='#'&&a[sx][t.y]!='E'){
                    mp[{-1,-1}][{sx,t.y}]=1;
                    q.push({-1,-1,sx,t.y,t.cnt+1,1});
                }
                int sy=t.y-1;
                if(sy>=1&&sy<=m&&mp[{t.x,sy}][{t.xx,sy}]==0&&!(a[t.x][sy]==a[t.xx][sy]&&a[t.x][sy]=='#')){
                    mp[{t.x,sy}][{t.xx,sy}]=1;
                    q.push({t.x,sy,t.xx,sy,t.cnt+1,2});
                }
                sy=t.y+1;
                if(sy>=1&&sy<=m&&mp[{t.x,sy}][{t.xx,sy}]==0&&!(a[t.x][sy]==a[t.xx][sy]&&a[t.x][sy]=='#')){
                    mp[{t.x,sy}][{t.xx,sy}]=1;
                    q.push({t.x,sy,t.xx,sy,t.cnt+1,2});
                }
            }
        }
    }
}
signed main(){
    cin>>n>>m;
    Clear();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(a[i][j]=='O'){
                xxx=i;
                yyy=j;
            }
            else if(a[i][j]=='X'){
                if(x==-1&&y==-1){
                    x=i;
                    y=j;
                    d=1;
                }
                else{
                    xx=i;
                    yy=j;
                    d=2;
                }
            }
        }
    }
    // cout<<x<<" "<<y<<"\n"<<xx<<" "<<yy<<"\n"<<xxx<<" "<<yyy<<"\n"<<d;
    bfs();
    if(ans==INF){
        I;
    }
    else{
        cout<<ans;
    }
    return 0;
}

回复

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

正在加载回复...