POJ 3278 Catch That Cow【BFS】

题意:给出n,k,其中n可以加1,可以减1,可以乘以2,问至少通过多少次变化使其变成k

POJ 3278 Catch That Cow【BFS】

可以先画出样例的部分状态空间树

POJ 3278 Catch That Cow【BFS】

可以知道搜索到的深度即为所需要的最小的变化次数

POJ 3278 Catch That Cow【BFS】

下面是学习的代码----@_@

#include<iostream>  

#include<cstdio>  

#include<cstring>  

#include<algorithm>

#include<queue>  

#define maxn 100005

using namespace std;

queue<int> q;

int visit[maxn],step[maxn],n,k;



int bfs(int n,int k)

{

	int head,next,i;

	q.push(n);

	visit[n]=1;

	step[n]=0;

	while(!q.empty())

	{

		head=q.front();

		q.pop();

		for(i=1;i<=3;i++)

		{

			if(i==1) next=head-1;

			else if(i==2) next=head+1;

			else next=2*head;

			if(next<=100005&&next>0) 

			{

				if(!visit[next])//判重 

		     	{

				q.push(next);

				visit[next]=1;

				step[next]=step[head]+1;

			    }

			}

			if(next==k) return step[next];

		}		

	}

}

int main()

{

	scanf("%d %d",&n,&k);

	if(n>=k) printf("%d\n",n-k);

	else

	printf("%d\n",bfs(n,k));	

}

  学习BFS的第一题————go---go--

 

补写一个模拟队列写的,还是学习的代码,参看的这一篇http://blog.csdn.net/freezhanacmore/article/details/8168265

#include<iostream>  

#include<cstdio>  

#include<cstring>  

#include<algorithm> 

#define maxn 100005 

using namespace std;

int vis[maxn],n,k;

struct node

{

	int x,step;

} q[maxn];

int bfs(int n,int k)

{

	node now,next;

	int head=0,tail=0;

	q[tail].x=n;//将当前这一节点入队 

	q[tail].step=0;tail++;

	vis[n]=1;

	while(head<tail)

	{

		now=q[head];//取出队头 

		head++;//弹出队头 

		for(int i=0;i<3;i++)

		{

			if(i==0) next.x=now.x+1;

			else if(i==1) next.x=now.x-1;

			else next.x=now.x*2;

			if(next.x<0||next.x>=maxn) continue;//越界了的话就剪枝 

			if(!vis[next.x])

			{

				vis[next.x]=1;

				next.step=now.step+1;

				q[tail]=next;

				tail++;

				if(next.x==k) return next.step;

			}

		}

	}	

}

int main()

{

	while(scanf("%d %d",&n,&k)!=EOF)

	{

		memset(vis,0,sizeof(vis));

		if(n>=k) printf("%d\n",n-k);

		else printf("%d\n",bfs(n,k));

	}

}

  

你可能感兴趣的:(catch)