poj 4001-廣度搜索

描述

農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農夫起始位於點N(0<=N<=100000),牛位於點K(0<=K<=100000)。農夫有兩種移動方式:

1、從X移動到X-1或X+1,每次移動花費一分鐘
2、從X移動到2*X,每次移動花費一分鐘

假設牛沒有意識到農夫的行動,站在原地不動。農夫最少要花多少時間才能抓住牛?

輸入
兩個整數,N和K
輸出
一個整數,農夫抓到牛所要花費的最小分鐘數
樣例輸入
5 17
樣例輸出
4

思路

雖然是給的數軸上的點,但不能再數軸上隨便移動,只能通過特定的路徑進行移動。因此,可以將數軸和路徑看做圖,問題就變成了圖上最短路徑問題。由於圖上所有邊都是等長的,可以直接進行廣度搜索。如果進行深度搜索的話,容易搜偏導致比較費時。

#include <stdio.h>
#include <queue>
#define M 100005

using namespace std;
struct Node{
  int level;
  int f;
   Node(){
   level=0;
   f=0;
  }
};

Node node[100005];
int N,K;
int main()
{
    scanf("%d%d",&N,&K);
    //N=5,K=17;
    queue<int> q;
    q.push(N);
    int next = N;
    node[N].f=1;
    while(!q.empty()){
        next = q.front();
        q.pop();

        if(next == K){
            printf("%d",node[K].level);
            break;
        }

        if(next+1<M && node[next+1].f==0){
            q.push(next+1);
            node[next+1].level=node[next].level+1;
            node[next+1].f=1;
        }
        if(next-1>=0 &&node[next-1].f==0){
            q.push(next-1);
            node[next-1].level=node[next].level+1;
             node[next-1].f=1;
        }
        if(next*2<M && node[next*2].f==0){
            q.push(next*2);
            node[next*2].level=node[next].level+1;
             node[next*2].f=1;
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章