BFS и приложения
BFS, чтобы найти путь к узлу N (состояние)
Ключевые переменные :
- Очередь: Queue <Int> Q
- Тэг массив: INT VIS [MAX] = {0}
пример
POJ 4100 Поймать, корова
Мышление: хранить информацию, определяющую переменным шагом узла структуры (в том числе количество узлов и количество шагов достигает узла), то широкий поиск начинается до поиска целевого узла из исходного узла К 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;
}