広度検索(BFS)入門テーマ:あの牛を捕まえる


広捜を習って間もなく、いくつかの広捜の問題を磨いて、この捕まえた牛を発見しました(原版英語題:Catch that cow)
これはとても経典の広捜題で、終わった後に発見するのはとても悪くなくて、広捜の簡単な問題に属して、しかし広捜に対してよく知らないでまたできません.
広捜しを始めたばかりの頃は理解できないかもしれませんが、ゆっくり勉強して広捜しの基本的な考え方を身につけると、新学者はステップ数をどのように記録するか(DFSでは一歩一歩歩いているのでステップ数の記録は簡単)という疑問を抱くかもしれませんが、実際にはiの位置を検索したときに歩いたステップ数を表す配列step[i]を開くことができると考えてみましょう.問題は楽しく解決した.
このブログを書いて私の学習経験を記録して、もし私と同じ初心者がいたら、私のブログがあなたのいくつかの問題を解決することを望んで、それは最高です.
コードを送信:
#include
   
    
#include
    
     
#include
     
      
#include
      
       
#include
       
         #include
        
          #include
         
           #include
          
            using namespace std; int n,k; int nf[1000000]; int step[1000000]; bool hav[1000000]; int main(){ scanf("%d%d",&n,&k); nf[1]=n; hav[n]=1; int head=1,tail=2; while(head<=tail) { if(nf[head]+1==k||nf[head]-1==k||nf[head]*2==k) { printf("%d",step[head]+1); return 0; } if(hav[nf[head]+1]==0&&nf[head]+1<=1000000) { hav[nf[head]+1]=1; step[tail]=step[head]+1; nf[tail]=nf[head]+1; tail++; } if(hav[nf[head]-1]==0&&nf[head]-1>=0) { hav[nf[head]-1]=1; step[tail]=step[head]+1; nf[tail]=nf[head]-1; tail++; } if(hav[nf[head]*2]==0&&nf[head]*2<=1000000) { hav[nf[head]*2]=1; step[tail]=step[head]+1; nf[tail]=nf[head]*2; tail++; } head++; } return 0; }