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<
#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<