搜索 - 广度优先搜索(BFS)普通模板
2024-10-18 02:57:15
bfs广度优先搜索模板
本人蒟蒻,为响应号召 写下bfs模板一篇 可以适用于求最短步数,等最优解问题。如有不足或者不对的地方请各位大佬及时指出 - 欢迎来戳
具体实现代码(C++)
各个模块功能和简单明了
#include <iostream>
#include <queue>
#include <algorithm>
#define N 100
using namespace std;
int n, m;
int map[N][N];
bool vis[N][N];
//一般情况下的方向数组 具体的视情况列方向数组
int dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} }; //方向数组
struct node{
int x;
int y;
int step; //可以记录最小步数之类的最优解
node(int x, int y ,int step) :x(x), y(y),step(step) { }
node(){ }
};
//判断是否在图中
bool inmap(int x, int y)
{
if (x >= 1 && x <= n && y >= 1 && y <= m)return true;
else return false;
}
void bfs(int sx, int sy)
{
vis[sx][sy] = 1; //标注起始点
queue<node> q;
q.push(node(sx, sy ,0));
while (!q.empty())
{
node now = q.front();
for (int i = 0; i < 4; i++)
{
int x = now.x + dir[i][0];
int y = now.y + dir[i][1];
int step = now.step + 1; //一次只走一步
if (inmap(x, y) == true && vis[x][y] == false)
{
//此处还可以进行别的剪枝
//可以是多个条件剪枝或者终止条件由具体题目而定
if (到达终点或者是其他剪枝操作)
{
//进行最后处理其他剪枝操作....
return;
}
else {
vis[x][y] = 1; //标记该点已经来过并将其放入队列
q.push(node(x, y,step + 1));
}
}
else return;
}
q.pop();
}
return;
}
void init()
{
int sx, sy;
cin >> n >> m >> sx >> sy;
bfs(sx, sy);
}
int main()
{
init();
system("pause");
return 0;
}
最新文章
- SVN使用_获取某版本后改动的文件列表
- cout格式化输出
- List Arraylist 数组的区别
- Python——函数的命名关键字参数
- JS的学习体会与分享
- 在Windows和UNIX下利用PHP和LDAP进行身份验证
- 【BZOJ】1038: [ZJOI2008]瞭望塔
- memcached +php环境配置和分析
- XML文件操作类--创建XML文件
- 搭建SpringMVC+MyBatis开发框架四
- 完美解决IE6中fixed抖动问题的方法
- Redmine backlogs 升级
- Java按钮设计
- 【LeetCode】462. Minimum Moves to Equal Array Elements II
- myeclipse 之 快捷键
- “strcmp()” Anyone?
- Caliburn.Micro - 框架搭建
- JVM学习记录-对象已死吗
- 第2次作业 -- 熟悉 JUnit 测试
- JavaScript中为什么使用立即执行函数来封装模块?