I - Penguins (bfs)
直接模拟即可
需要注意的是,边界视为有墙,所以将所有边界值赋值为1
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<stack> #include<cstring> #include<queue> using namespace std; const int fx1=1,fy1=20,fx2=1,fy2=1; int n,m; int X1[4]={0,-1,1,0}; int X2[4]={0,1,-1,0}; int Y[4]={1,0,0,-1};//下左右上 struct Edge{ int x1; int y1; int x2; int y2; Edge(int xx1,int yy1,int xx2,int yy2):x1(xx1),y1(yy1),x2(xx2),y2(yy2){} Edge(){} }; int vis[24][24]; int vis2[24][24]; int pri[24][24][24][24]; Edge cur[24][24][24][24]; int nmb=10; void bfs() { queue<Edge>q; q.push(Edge(20,20,20,1)); pri[20][20][20][1]=5; while(!q.empty()){ Edge t=q.front(); q.pop(); if(t.x1==1&&t.y1==20&&t.x2==1&&t.y2==1) { break; } for(int i=0;i<4;i++) { int xx1=t.x1+Y[i]; int xx2=t.x2+Y[i]; int yy1=t.y1+X1[i]; int yy2=t.y2+X2[i]; if(vis[xx1][yy1]==1)xx1=t.x1,yy1=t.y1; if(vis2[xx2][yy2]==1)xx2=t.x2,yy2=t.y2; //if(xx1==5&&yy1==20&&xx2==5&&yy2==1)cout<<t.x1<<" "<<t.y1<<" "<<t.x2<<" "<<t.y2<<endl; if(!pri[xx1][yy1][xx2][yy2]) { cur[xx1][yy1][xx2][yy2]=t; pri[xx1][yy1][xx2][yy2]=i+1; q.push(Edge(xx1,yy1,xx2,yy2)); } } } } int main(){ for(int i=1;i<=20;i++) { char s[24]; cin>>s; for(int j=0;j<strlen(s);j++) { if(s[j]=='.')vis[i][j+1]=0; else vis[i][j+1]=1; } cin>>s; for(int j=0;j<strlen(s);j++) { if(s[j]=='.')vis2[i][j+1]=0; else vis2[i][j+1]=1; } } for(int i=0;i<=21;i++)vis[0][i]=1,vis2[0][i]=1; for(int i=0;i<=21;i++)vis[i][0]=1,vis2[i][0]=1; for(int i=0;i<=21;i++)vis[21][i]=1,vis2[21][i]=1; for(int i=0;i<=21;i++)vis[i][21]=1,vis2[i][21]=1; /*for(int i=0;i<=21;i++) { for(int j=0;j<=21;j++)cout<<vis[i][j]; cout<<" "; for(int j=0;j<=21;j++)cout<<vis2[i][j]; cout<<endl; }*/ bfs(); //cout<<pri[20][20][20][1]<<endl; //cout<<pri[20][19][20][1]<<endl; int x1=1,y1=20,x2=1,y2=1; stack<int>s; int ans=0; while(pri[x1][y1][x2][y2]!=5) { ans++; int x=pri[x1][y1][x2][y2]; s.push(pri[x1][y1][x2][y2]); Edge t=cur[x1][y1][x2][y2]; int tx=t.x1,ty=t.y1,txx=t.x2,tyy=t.y2; //cout<<tx<<ty<<txx<<tyy<<endl; x1=tx; x2=txx; y1=ty; y2=tyy; vis[x1][y1]=2; vis2[x2][y2]=2; } cout<<ans<<endl; while(!s.empty()) { int x=s.top(); s.pop(); if(x==1)cout<<"D"; if(x==2)cout<<"L"; if(x==3)cout<<"R"; if(x==4)cout<<"U"; } cout<<endl; vis[fx1][fy1]=2; vis2[fx2][fy2]=2; for(int i=1;i<=20;i++) { for(int j=1;j<=20;j++) { if(vis[i][j]==0)cout<<"."; if(vis[i][j]==1)cout<<"#"; if(vis[i][j]==2)cout<<"A"; } cout<<" "; for(int j=1;j<=20;j++) { if(vis2[i][j]==0)cout<<"."; if(vis2[i][j]==1)cout<<"#"; if(vis2[i][j]==2)cout<<"A"; } cout<<endl; } return 0; }

浙公网安备 33010602011771号