zoukankan      html  css  js  c++  java
  • I-Penguins(2021牛客暑期多校2)

    题目传送门

    分析:求最短路的题目,不需要把点标代号。

    code:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define File(x) freopen("(x)","r",stdin)
    #define pf printf
    #define ull unsigned long long
    #define db double
    #define ll long long
    #define MAXN 
    #define MAXM 
    #define P 
    
    const int dax[]={1,0,0,-1};
    const int day[]={0,-1,1,0};
    const int dbx[]={1,0,0,-1};
    const int dby[]={0,1,-1,0};
    const char ch[]={'D','L','R','U'};
    
    int dis[22][22][22][22];
    char mp1[22][22],mp2[22][22],s[22][22][22][22];
    
    struct Sta
    {
        int ax,ay,bx,by;
    }pre[22][22][22][22];
    
    queue<Sta>q;
    
    bool err(int a,int b,int c,int d){
        if(a<1||a>20)return 1;
        if(b<1||b>20)return 1;
        if(c<1||c>20)return 1;
        if(d<1||d>20)return 1;
        return 0;
    }
    
    
    void bfs(){
        q.push(Sta{20,20,20,1});
        while(!q.empty()){
            Sta tmp=q.front();q.pop();
            int ax=tmp.ax,ay=tmp.ay,bx=tmp.bx,by=tmp.by;
            for(int i=0;i<4;i++){
                int cx=ax+dax[i],cy=ay+day[i];
                int dx=bx+dbx[i],dy=by+dby[i];
                if(mp1[cx][cy]!='.')cx=ax,cy=ay;
                if(mp2[dx][dy]!='.')dx=bx,dy=by;
                if(dis[cx][cy][dx][dy]||err(cx,cy,dx,dy))continue;
                dis[cx][cy][dx][dy]=dis[ax][ay][bx][by]+1;
                pre[cx][cy][dx][dy]=Sta{ax,ay,bx,by};
                s[cx][cy][dx][dy]=ch[i];
                q.push(Sta{cx,cy,dx,dy});
                if(cx==1&&cy==20&&dx==1&&dy==1)return;
           }
        }
    }
    
    void print(int ax,int ay,int bx,int by,int step){
        // if(ax&&ay&bx&&by)
        // cout<<ax<<" "<<ay<<" "<<bx<<" "<<by<<endl;
         mp1[ax][ay]=mp2[bx][by]='A';
        if(ax==20 && ay==20&&bx==20&&by==1){
            printf("%d
    ",step);
            return;
        }
        Sta tmp=pre[ax][ay][bx][by];
        print(tmp.ax,tmp.ay,tmp.bx,tmp.by,step+1);
        printf("%c",s[ax][ay][bx][by]);
    }
    
    int main(){
    
        for(int i=1;i<=20;++i)scanf("%s%s",mp1[i]+1,mp2[i]+1);
        bfs();
        // cout<<"bfs";
        print(1,20,1,1,0);
        puts("");
        for(int i=1;i<=20;++i)
        printf("%s %s
    ",mp1[i]+1,mp2[i]+1);
       return 0;
    }
     
    
  • 相关阅读:
    对眼睛有利的屏幕颜色
    C++的动态联编与静态联编【转载】
    关于虚析构函数
    虚析构函数的使用(转载!)
    c/c++内存机制(转)
    delete this
    PhpStorm环境配置
    flutter之路由与导航
    flutter之Widget
    Flutter项目初步认识
  • 原文地址:https://www.cnblogs.com/GUOGaby/p/15035331.html
Copyright © 2011-2022 走看看