BFS寻找到某个结点N(某个状态)的路径
关键变量:
- 队列: queue< int > q
- 标记数组: int vis[MAX] = { 0 }
例题
POJ 4100 Catch that cow
思路:定义结构体变量step 保存结点的信息(包括结点的编号和到达该节点的步数),然后从初始结点 N 开始广搜直到搜到目标结点 K 。当搜到结点 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;
}