HOJ 1440ライダー巡りBFS DFS

1889 ワード

HOJ 1440ライダー巡りBFS DFS


タイトルリンク:クリックしてリンクを開く
テーマ:
あなたの友达は騎士巡りの問題を研究しています.あなたの問題は2つの四角い間の移動の最小ステップを見つけることです.この問題を解決すると、あなたの旅行方法を見つけるのは簡単になります.
あなたの仕事の時に1つのプログラムを書いて、四角い格子A Bは入力としてAからBの最も少ないステップ数を決定します
入力:
入力には複数のテストがあり、魅族テストの1行は2つの四角形の位置を表し、各四角形をスペースで区切ってアルファベットと数字で構成されています.
出力:
出力形式は:To get from xx to yy takes n knight moves.".
问题解决:この问题を见ると、碁盤検索、歩数を记录したいと思います.検索问题検索の有身検索と広さ検索です.どちらでもいいようです.
ここでは、深度優先検索の概念を説明します.
DFS:深さ優先探索のアルゴリズムは、木の深さに沿って可能な限り深い探索木の分岐を遍歴し、ノードVのすべてのエッジが探索された場合、Vのエッジの開始ノードを遡及して発見する
このプロセスは、ソースノードからすべてのノードが発見されるまで行われ、発見されていないノードがまだ存在する場合、そのうちの1つをソースノードとして選択し、すべてのノードが検索が完了するまで、通常の盲目的な検索を繰り返す. 
ずっと下を検索して1つを見つけて積み上げて、続けて下を検索して、検索できなくなって弾き出して、スタックを押すのと似ているのでスタックを使う必要があります
BFS:広さ優先探索アルゴリズムは任意のノードVから順に1つの拡張可能な各ノードを探索し、1層のノードがすべて探索された後、次の拡張可能なすべてのノードを下に探索し、すべてがアクセスされていることを知って、彼が各層にアクセスしていることを見ることができ、各層が先にアクセスしてから次の層にポップアップし、先に先に出て、キューを使用して実装するには
次に、広さ優先で問題を解きます.
キューの使用:
#include
#include
#include
#include
using namespace std;

struct ss
{
     int x;
     int y;
};

int main()
{ // 
    //        N M ,  
      int dx[8] = {-2, -1, 1, 2, 1, 2, -1, -2};
      int dy[8] = { 1, 2, 2, 1, -2, -1, -2, -1};
      int dis[8][8];
      char st[8];
      char en[8];
      int i ;
      while(scanf("%s %s", st,en))
      {
          ss start ;
          ss end;
          memset(dis, -1, sizeof(dis)); // 
          start.x = st[0] - 'a';
          start.y = st[1] -'1';
          end.x  = en[0] - 'a';
          end.y = en[1] - '1';
          // 
          dis[start.x][start.y] = 0;
          queueq;
          q.push(start); // 
          ss nex , tmp;
          if(start.x == end.x && start.y == end.y)
          {
              cout<