BFS:

** 当知道初始和目标状态的,用双向BFS:

无权图最好用BFS

不用重复如队**

实现框架:

抄来的(来源:https://www.luogu.org/blog/stephen2333/solution-p1135)

ps: 我一开始也写过,不过真心觉得他写的好

  1. 对于初始状态入队,设置初始状态为已访问
  2. 如果队列不为空时,出队队头元素,否则跳到第5步
  3. 检查出队的元素是否为最终解,如果是则跳到第5步。
  4. 对于出队的元素,检查所有相邻状态,如果有效并且未访问,则将

    所有有效的相邻状态进行入队,并且设置这些状态为已访问,然后
  5. 跳到第2步重复执行检查最后出队的元素是否为最终解,如果是输出结果,否则说明无解

通常用队列(先进先出,FIFO)实现

初始化队列q;
q = {起点u};标记s为已访问;
while(q为非空){
去q队首元素 now;now出队;
If(now == 目标状态) {….}
所有与now 相连 并 且未被访问的点进入队列(没被标记);
并标记now已访问;
}

矩形宽搜:

题目描述

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?

输入输出格式

输入格式:

输入:整数m,n(m行,n列)

矩阵

输出格式:

输出:细胞的个数

/*

4 10

0 2 3 4 5 0 0 0 6 7

1 0 3 4 5 6 0 5 0 0

2 0 4 5 6 0 0 6 7 1

0 0 0 0 0 0 0 0 8 9

*/

#include<cstdio>
#define maxn 100 int m,n,cnt = 0;
char s[maxn];
int a[maxn][maxn],vis[maxn][maxn]; int q[maxn];
int movex[5] = {0,1,-1,0,0};
int movey[5] = {0,0,0,1,-1}; void bfs(int x, int y) {
int l = 0, r = 0;
q[r++] = x;
q[r++] = y;//按顺序加入 取出时就是按的这个顺序取出
while(l < r) {//当 l = r时 队列为空 就找完第53行传入的点附近的数(可以和它构成cells的)
int nowx = q[l++];
int nowy = q[l++];//取出当前点的位置
for(int i = 1; i <= 4; i++) {//判断四个方向(上下左右)的数
int ix = nowx + movex[i];//当前(四个之一)方向上的坐标
int iy = nowy + movey[i];
if(ix < 1 || iy < 1 || ix > n || iy > m) continue;//一定要写!!!矩阵的bfs的边界
//if(ix == 0 || iy == 0 || ix || ix > n || iy > m) continue;//最好写上面的
if(a[ix][iy]) {
if(!vis[ix][iy]) {//再次判断它用不用被选 选过之后就没必要选了
vis[ix][iy] = 1;
q[r++] = ix;
q[r++] = iy;//入队
}
}
}
}
} int main() {
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) {
scanf("%s",s);//先输入一行较长的字符数组,因为原题的没有空格
for(int j = 1; j <= m; j++) {
a[i][j] = s[j - 1] - '0';//s[j - 1]是s的第一个元素
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(!vis[i][j]) {//找出没有走过的点
vis[i][j] = 1;//做标记
if(a[i][j]) { //这才是找到可以宽搜的 点
bfs(i,j);
cnt++;
}
}
}
}
printf("%d",cnt);
}

DFS;

通常搜出组合方式,求最优解的时候,我们考虑用DFS

数据结构:系统栈;

bfs初学的更多相关文章

  1. [USACO09OCT]Invasion of the Milkweed】乳草的侵占-C++

    Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高 ...

  2. (BFS)hdoj1242-Rescue

    题目地址 初学BFS,第一次用BFS做题.题目就是一个基本的BFS模型,需要稍加注意的是遇到警卫时间要+1,以及最后比的是最短的时间而不是步数. #include<cstdio> #inc ...

  3. BFS和队列

    深度优先搜索(DFS)和广度优先搜索(BFS)是基本的暴力技术,常用于解决图.树的遍历问题. 首先考虑算法思路.以老鼠走迷宫为例: (1):一只老鼠走迷宫.它在每个路口都选择先走右边,直到碰壁无法继续 ...

  4. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  5. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

  6. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  7. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  8. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  9. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

随机推荐

  1. Centos7下Docker的使用

    一.安装Docker 1.1.查看原有系统是否已经安装docker yum list installed | grep docker 1.2.如果有则不需要继续安装,想重新安装,先卸载 yum -y ...

  2. js---通过arguments来获取指定参数

    通过访问arguments对象的length属性可以获取有多少个参数传递给了函数. 如:每次被调用的时候,输出传入其中的参数个数 function doAdd(){ alert(arguments.l ...

  3. Android App退出检测

    app的退出检测是很难的,但是获取app“要退出”的状态就容易多了,退出的瞬间并不是真的退出了,ActivityManager要销毁activity,也需要一些时间和资源的. 先见下面的运行效果:  ...

  4. JQuery学习笔记系列(二)----

    jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).其中也提供了很多函数来更加简洁的实现复杂的功能. 事件切换函数toggle ...

  5. JVM上的下一个Java——Scala

    Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言.Scala编程语言近来抓住了很多开发者的眼球.它看起来像是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格. ...

  6. Linux系统编程博客参考

    通过看前人的博客更易于把握知识要点 http://www.cnblogs.com/mickole/category/496206.html <Linux系统编程> http://www.c ...

  7. Ecshop 扯淡问题

    1:解决 :在 temp 文件下创建 backup文件夹   修改权限 2:待补充...

  8. Python笔记9-----不等长列表转化成DataFrame

    1.不同长度的列表合并成DataFrame. 法1: ntest=['a','b'] ltest=[[1,2],[4,5,6]] 先变成等长的列表:(a:1),(a:2),(b:4),(b:5),(b ...

  9. element合并单元格方法及遇到问题的解决办法

    效果如图: 代码如下 <!-- 查看选课 --> <template> <div> <el-table :data="listData" ...

  10. ELO kernels 记录

    these kernel for discuss how to handle outliers in target values. 一:Ashish Gupta: 在16年6月到18年8月,激活卡的人 ...