zoukankan      html  css  js  c++  java
  • BFS 模板

    转自:欣哥

    下面是bfs一般的形式,谈不上模板
    但一般都这么来做
    有点乱
    有什么多交流

    bfs一般用于求最短时间


    #include<stdio.h>
    #include<queue>
    using namespace std; 上面是头文件定义


    struct stu 开两个结构体abc,xyz,一般都开两个
    {
    int x;
    int y;
    int t;
    }abc,xyz;


    queue<struct stu> p; 定义一个struct stu型STL队列


    int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}} 方向数组

    char map[50][50] 地图,一般不超过50*50

    int a,b,c,t,flag; 全局变量,一般是地图大小等


    void bfs() 进入bfs
    {
    int i;

    while(!p.empty())队列为空时跳出
    {
    abc=p.front(); 从队首读入
    p.pop(); 删除队首

    if()这里一般判断现在abc结构体所指的 map[][] 是否为最终目标
    {
    。。。。。
    return;
    }

    for(i=0;i<4;i++) 循环周围四个方向
    {
    xyz.x=abc.x+dir[i][0]; xyz.x用于记录由abc产生的新的横坐标
    xyz.y=abc.y+dir[i][1]; xyz.y用于记录由abc产生的新的纵坐标

    if((xyz.x>=1&&xyz.x<=a)&&(xyz.y>=1&&xyz.y<=b))&&(!map[xyz.x][xyz.y])) 如果新坐标还在迷宫里且不是墙
    {

    xyz.t=abc.t+1; 时间+1
    p.push(xyz); 压入队尾

    map[xyz.x][xyz.y]=1; 标记为走过
    }
    }

    }
    }
    int main()
    {

    int k,i,j,r;
    scanf("%d",&k);
    while(k--)
    {
    scanf("%d%d%d%d",&a,&b,&c,&t);
    for(i=1;i<=a;i++)
    {
    for(j=1;j<=b;j++)
    {
    scanf("%d",&map[i][j]);
    }
    }

    flag=-1;
    abc.x=abc.y=abc.z=1;
    abc.t=0;
    p.push(abc);

    bfs();

    while(!p.empty()) 清空队列,否则影响下一组输入
    {
    p.pop();
    }
    }
    return 0;
    }

  • 相关阅读:
    前端CSS部分简单整理
    前端HTML部分简单整理
    Top Android App使用的组件
    使用DialogFragment创建对话框总结
    Rails常用命令
    developer.android.com笔记
    Google Maps API v2 Demo Tutorial
    Android学习的一些问题
    Android学习过程
    Beginning Android 4 Programming Book学习
  • 原文地址:https://www.cnblogs.com/xuesen1995/p/4105795.html
Copyright © 2011-2022 走看看