BFS(广度优先搜索)-POJ3278-Catch That Cow(抓住那头牛)

Myth丶恋晨 2022-05-17 02:16 328阅读 0赞
  • BFS(广度优先搜索)-POJ3278-Catch That Cow(抓住那头牛)


  • 题目链接:Catch That Cow

  • BFS:

广度优先搜索(Breadth First Search, BFS)是对树的逐层遍历,通过距终点状态由远到近对所有可能的状态进行搜索并剪枝一般用于求解达到某目标的最小步骤数

思路:

æä½ç 有两点需要说明:

  1. 注意红色的叉,表示搜索过程已经搜索过的节点,这时要跳过。 所以初始化BFS数组元素为-1表示未搜索状态
  2. 已经搜索过第i层的节点,那么第i+1层的搜索从哪个节点开始?这时需要设置一个队列i层已经搜索过的节点入队(在对第i−1层的节点分叉时),然后依次作为第i+1层节点的父节点出队

    • 代码:

      include

      include

      include

      using namespace std;

      define Max_Length 100001

      int N, M, Cur;

      int BFS[Max_Length], Elect[3];

      queue Level_Data;

      void Do_BFS()
      {
      fill(BFS, BFS + Max_Length, -1);

      Level_Data.push(N);
      BFS[N] = 0;

      while (!Level_Data.empty())
      {

      1. Cur = Level_Data.front();
      2. Level_Data.pop();
      3. if (M == Cur) //走到终点M,完成跳出
      4. break;
      5. Elect[0] = Cur - 1;
      6. Elect[1] = Cur + 1;
      7. Elect[2] = Cur * 2;
  1. for (int i = 0; i < 3; i++)
  2. {
  3. if (Elect[i] >= 0 && Elect[i]<Max_Length && BFS[Elect[i]] == -1) //DFS[Elect[i]]==-1表示当前状态Elect[i]之前没有访问过,同时保证数据不能越界
  4. {
  5. Level_Data.push(Elect[i]);
  6. BFS[Elect[i]] = BFS[Cur] + 1; //当前状态Cur走向下一步
  7. }
  8. }
  9. }
  10. cout << BFS[M] << endl; //输出结果
  11. }
  12. int main()
  13. {
  14. cin >> N >> M;
  15. Do_BFS();
  16. return 0;
  17. }
  • 参考:

Florence_Janie-抓住那头牛(POJ NO.2971)

valval-广度优先搜索bfs与抓住那头奶牛(Catch that cow, poj3278)

发表评论

表情:
评论列表 (有 0 条评论,328人围观)

还没有评论,来说两句吧...

相关阅读