牛客小白月赛7-H CSL的校园卡

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_13579/article/details/82988189

地址:https://www.nowcoder.com/acm/contest/190/H

思路:状态压缩DP+BFS

用dp[x1][y1][x2][y2][s]来表示两人分别在点 (x1,y1),(x2,y2)处走过的状态s时的所用时间,那么再用BFS来找到第一个满足条件的即可

Code:

#include<iostream>
#include<queue>
using namespace std;
 
struct node{
    int x1,y1;
    int x2,y2;
    int t,s;
};
const int MAX_S=(1<<16)+5;
const int f[][2]={-1,0, 1,0, 0,-1, 0,1};
int n,m,ans,Sum;
string G[5];
bool boo[5][5][5][5][MAX_S];
 
void BFS(int x,int y);
int main()
{
    cin>>n>>m;
    int x0,y0;
    for(int i=0;i<n;++i)
    {
        cin>>G[i];
        for(int j=0;j<m;++j)
            if(G[i][j]=='S'){
                x0=i;   y0=j;
                Sum+=(1<<(i*4+j));
            }else   if(G[i][j]=='O'){
                Sum+=(1<<(i*4+j));
            }
    }
    BFS(x0,y0);
    cout<<ans<<endl;
    return 0;
}
 
void BFS(int x,int y)
{
    queue<node> Q;
    Q.push(node{x,y,x,y,1<<(x*4+y),0});
    boo[x][y][x][y][(1<<(x*4+y))]=1;
    while(!Q.empty()){
        int x1,y1,x2,y2;
        node u=Q.front();   Q.pop();
        for(int i=0;i<4;++i)
        {
            x1=u.x1+f[i][0];    y1=u.y1+f[i][1];
            int t1=1<<(x1*4+y1);
            if(x1>=0&&x1<n&&y1>=0&&y1<m&&G[x1][y1]!='X'){
                for(int j=0;j<4;++j)
                {
                    x2=u.x2+f[j][0];    y2=u.y2+f[j][1];
                    int t2=1<<(x2*4+y2);
                    if(x2>=0&&x2<n&&y2>=0&&y2<m&&G[x2][y2]!='X'){
                        int s=(t1|t2)|u.t;
                        if(!boo[x1][y1][x2][y2][s]){
                            Q.push(node{x1,y1,x2,y2,s,u.s+1});
                            boo[x1][y1][x2][y2][s]=1;
                        }
                        if(s==Sum){
                            ans=u.s+1;
                            return;
                        }
                    }
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/C_13579/article/details/82988189