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;
}

 

posted @ 2021-07-23 17:11  lemonGJacky  阅读(52)  评论(0)    收藏  举报