BFSとアプリケーション
ノードN(状態)へのパスを見つけるためにBFS
重要な変数:
- キュー:キュー<整数> Q
- タグ・アレイ: INT VIS [MAX] = {0}
例
その牛POJ 4100キャッチ
思考:(ノードノードの数と工程数に達するなど)変数ノード段差構造を定義する格納された情報、初期ノードK Nから宛先ノード探索まで、幅広い検索開始 ノードK、K.stepsの探索は最短パスである場合
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAX = 100010;
const int INF = 0x3f3f3f3f;
struct step {
int x;
int steps;
step(int xx, int ss)
{
x = xx;
steps = ss;
}
};
queue<step> q; //定义一个队列,用来存放广搜的结点
int vis[MAX] = { 0 };
int minStep = INF;
int N, K;
void bfs()
{
q.push(step(N, 0));
vis[N] = 1;
while (!q.empty())
{
step s = q.front();
if (s.x == K)
{
minStep = s.steps;
return;
}
else
{
if (s.x - 1 >= 0 && !vis[s.x - 1])
{
q.push(step(s.x - 1, s.steps + 1));
vis[s.x - 1] = 1;
}
if (s.x + 1 < MAX && !vis[s.x + 1])
{
q.push(step(s.x + 1, s.steps + 1));
vis[s.x + 1] = 1;
}
if (s.x*2 < MAX && !vis[s.x*2])
{
q.push(step(s.x*2, s.steps + 1));
vis[s.x *2] = 1;
}
q.pop();
}
}
}
int main()
{
scanf("%d %d", &N, &K);
bfs();
if(minStep < INF)
cout << minStep << endl;
system("pause");
return 0;
}