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\n",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\n",mp1[i]+1,mp2[i]+1);
   return 0;
}
 
posted @ 2021-07-20 15:48  GUO_dx  阅读(47)  评论(0)    收藏  举报