POJ-3278 抓住這頭牛
阿新 • • 發佈:2018-12-04
廣搜解決。
廣搜搜出最短路,直接輸出返回就行了。
每個點只搜一次,而且界限進行一次判斷。
else 語句裡面不要用if else if,這樣的話就直走一條路了。
#include <iostream> #include <queue> #include <cstring> using namespace std; const int MaxN=100000; int visited[MaxN+10]; struct Step { int x; int steps; Step(int xx,int s):x(xx),steps(s){} }; queue <Step> q; int main() { int N,K; cin>>N>>K; if (N>=K) { cout<<N-K<<endl; return 0; } memset(visited,0,sizeof(visited)); q.push(Step(N,0)); visited[N]=1; while (!q.empty()) { Step s=q.front(); if (s.x==K) { cout<<s.steps<<endl; break; } else { if (s.x-1>=0&&!visited[s.x-1]) { q.push(Step(s.x-1,s.steps+1)); visited[s.x-1]=1; } if (s.x+1<=MaxN&&!visited[s.x+1]) { q.push(Step(s.x+1,s.steps+1)); visited[s.x+1]=1; } if (s.x*2<=MaxN&&!visited[2*s.x]) { q.push(Step(2*s.x,s.steps+1)); visited[2*s.x]=1; } q.pop(); } } return 0; }