版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
}
}
}
}
}
}