题目传送门
分析:求最短路的题目,不需要把点标代号。
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;
}