POJ-3278 Catch that cow

这道题是道典型的宽搜问题,我们可以从它的数据量就可以看出深搜要超时,并且最短路要用宽搜。

#include<iostream>
 #include<queue>
 using namespace std;
 queue<int>sm;//宽搜用队列
 int d[200001]={0},start,end;//d[]代表走到当前点需要的最少步数
 int search (){
 	sm.push(start);
 	for(int i=0;i<=200000;i++)d[i]=1001110;//初始化
 	d[start]=0;
 	while(sm.size()){
 		int p=sm.front();sm.pop();
 		if(p==end)break;
 			if((p-1)>=0&&d[p]+1<d[p-1]){//边界条件是0
 				d[p-1]=d[p]+1;
 				sm.push(p-1);
			 }
			  if(p<n&&d[p]+1<d[p+1]){//若小于n才能+1
			 	d[p+1]=d[p]+1;
			 	sm.push(p+1);
			 }
			  if(p<100001&&d[p]+1<d[2*p]){//小于n才能乘2
			 	d[p*2]=d[p]+1;
			 	sm.push(p*2);
			 }
		 
	 }
	 return d[end];
 }
 int main(){
	cin>>start>>end;
 	cout<<search();
 }


posted @ 2017-07-27 20:47  c201904  阅读(75)  评论(0编辑  收藏  举报