牛客:CSL的校园卡

链接:登录—专业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;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值