POJ3278-BFS容易出现思维漏洞

Question:

本体是标准的三个入口的BFS水题,但是细节问题太多

Solution:

1.数组没必要太大,一旦RE了,是因为出现了这么几种情况,出现负数,因为题中声明不会有负数的出现,把负数的情况短路掉
还有就是我们一不小心越界,这时候,我们和上一种一样,我们需要先预判短路,再进行下标访问

2.记录数组是很有必要的,防止TLE

3.小心n,k相同点额情况,此时输出结果为0,不用BFS

Code:

#include"iostream"
#include"cstdio"
#include"cstring"
#include"cstdlib"
#define N 1000000

using namespace std;

typedef struct node
{
	int x;
	int s;
}point;

int n,k;
int sum;
point queue[N];
int head;
int tail;
int book[N];

int main()
{
	cin>>n>>k;
	if(n==k) cout<<0<<endl;
	else{
	head=tail=1;
	queue[1].x=n;
	queue[1].s=0;
	tail++;
	memset(book,0,sizeof(book));
	book[n]=1;
	while(head!=tail)
	{
		int dx=queue[head].x+1;
		int dy=queue[head].x-1;
		int dz=queue[head].x*2;
		if(dx==k||dy==k||dz==k)
		{
			sum=queue[head].s+1;
			break;
		}
		if(dx<N&&dx>=0&&book[dx]==0)
		{
			book[dx]=1;
			queue[tail].x=dx;
			queue[tail++].s=queue[head].s+1;
		}
		if(dy<N&&dy>=0&&book[dy]==0)
		{
			book[dy]=1;
			queue[tail].x=dy;
			queue[tail++].s=queue[head].s+1;
		}
		if(dz<N&&dz>=0&&book[dz]==0)
		{
			book[dz]=1;
			queue[tail].x=dz;
			queue[tail++].s=queue[head].s+1;
		}
		head++;
	}
	cout<<sum<<endl;
}
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值