链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
今天是阳光明媚,晴空万里的一天,CSL早早就高兴地起床走出寝室到校园里转悠。
但是,等到他回来的时候,发现他的校园卡不见了,于是他需要走遍校园寻找它的校园卡。CSL想要尽快地找回他掉的校园卡,于是便求助于OneDay帮他一起找。
OneDay和CSL在同一已知的地点出发,并以相同的速度(1格/秒)搜索校园,试求两人走遍校园的最短时间。
输入描述:
第一行为两个整数n,m(1 ≤ n, m ≤ 4),表示地图的大小。接下来是n行m列的地图:X表示障碍物,S表示起点,O表示空地。障碍物不能直接经过,数据保证所有空地是可达的,起点有且只有一个。
输出描述:
输出一个整数表示两人共同走遍校园所需的最少时间。
示例1
输入
复制3 4 XSOO OOXO OOOO
3 4 XSOO OOXO OOOO
输出
复制5
5
说明
示例2
输入
复制2 3 XSX OOO
2 3 XSX OOO
输出
复制2
2
示例3
输入
复制4 4 SOOO OOOO OOOO OOOO
4 4 SOOO OOOO OOOO OOOO
输出
复制8
8
这个题主要是储存状态state,这个地方没出错,在判断是否可行的时候搞了一晚上段错误;;;最后原来是判断顺序问题,,,,,,,,,,
#include<iostream>
#include<queue>
using namespace std;
int n,m;
bool vis[4][4][4][4][1<<16];//记录目前的状态,两个人的位置以及当前
char g[4][4];
int sx,sy;
int endd=0;
int fx[]={0,0,1,-1};
int fy[]={1,-1,0,0};
struct ty
{
int x1,y1;
int x2,y2;
int state;
int step;
};
void bfs()
{
ty temp;
temp.x1=sx;
temp.x2=sx;
temp.y1=sy;
temp.y2=sy;
temp.state=1<<sx*4+sy;
temp.step=0;
vis[temp.x1][temp.y1][temp.x2][temp.y2][temp.state]=1;
queue<ty>q;
q.push(temp);
while(!q.empty())
{
ty tmp;
tmp=q.front();
q.pop();
if(tmp.state==endd)
{
cout<<tmp.step;
return;
}
for(int i=0;i<4;++i)
{
int xx1=tmp.x1+fx[i];
int yy1=tmp.y1+fy[i];
for(int j=0;j<4;++j)
{
int xx2=tmp.x2+fx[j];
int yy2=tmp.y2+fy[j];
int sstate=tmp.state|1<<(xx1*4+yy1)|1<<(xx2*4+yy2);
if(xx1<0||xx1>=n||yy1<0||yy1>=m)continue;
if(xx2<0||xx2>=n||yy2<0||yy2>=m)continue;
if(g[xx1][yy1]=='X'||g[xx2][yy2]=='X')continue;
if(vis[xx1][yy1][xx2][yy2][sstate]==1)continue;
vis[xx1][yy1][xx2][yy2][sstate]=1;
ty node;
node.x1=xx1;
node.x2=xx2;
node.y1=yy1;
node.y2=yy2;
node.state=sstate;
node.step=tmp.step+1;
q.push(node);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
cin>>g[i][j];
if(g[i][j]=='S')
{
sx=i;
sy=j;
}
if (g[i][j]!='X') endd|=(1<<(i * 4 + j));
}
}
bfs();
return 0;
}