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();
 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章