广度优先搜索(Breadth First Search)
Date:2019-07-03 14:29:02
- 走完一层的所有房间,再走下一层,用队列实现
算法实现
/*--------------------------模版----------------------*/
void BFS(int s)
{
queue<int> q;
q.push(s);
while(!q.empty())
{
//取出队首元素top
//访问队首元素top
//将队首元素出列
//将top的下一层结点中未曾入队的结点全部入队,并设置为已入队
}
} /*--------------------------访问-----------------------*/
struct node
{
int data;
}a[]; int main()
{
queue<int> q, p;
for(int i=; i<=; i++)
{
a[i].data = i; //a[1]=1,a[2]=2,a[3]=3
q.push(i); //这里将数组的下标入队,而非数组,可以避免传递形参,而无法修改实参的情况
p.push(a[i]);
}
p.front().data = ; //形参无法修改实参
printf("%d\n", a[].data); //output:1
a[] = ; //实参也无法修改形参
printf("%d\n", p.front().data); //output:1 a[q.front()].data = ; //通过传递下标,可以修改实参的值
printf("%d\n", a[].data); //output:100
return ;
}
/*-------------------------矩阵问题--------------------*/
/*
Descriptation:
给出一个m*n的矩阵,矩阵中的元素为0或1。称位置(x,y)与其上下左右四个位置是相邻的。
如果矩阵中有若干个1是相邻的(不必两两相邻),那么称这些1构成了一个“块”。求给定的矩阵
中“块”的个数。 Sample Input:
0 1 1 1 0 0 1
0 0 1 0 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 1 0
1 1 1 0 1 0 0
1 1 1 1 0 0 0 Sample output:
4
*/ #include <cstdio>
#include <queue>
using namespace std;
const int MAX_SIZE = ;
struct node
{
int x, y;
int data;
bool status; //status表示是否入队,而非是否已访问,否则会重复访问
}matrix[MAX_SIZE][MAX_SIZE]; //X[],Y[]存放四个操作方向
int n, m, X[]={,,,-}, Y[]={,-,,};
queue<node> q; void Init()
{
for(int i=; i<n; i++)
for(int j=; j<m; j++)
{
scanf("%d", &matrix[i][j].data);
matrix[i][j].status = true;
matrix[i][j].x = i;
matrix[i][j].y = j;
}
} void BFS(node x)
{
q.push(x);
while(!q.empty())
{
node s = q.front();
q.pop();
matrix[s.x][s.y].status = false; //这里不能修改s,需要修改matrix内的元素
if(s.data)
{
for(int i=; i<; i++)
{
int nowX = s.x + X[i];
int nowY = s.y + Y[i];
if(nowX< || nowX>=n || nowY< || nowY>=m)
continue;
if(matrix[nowX][nowY].data && matrix[nowX][nowY].status)
q.push(matrix[nowX][nowY]);
}
}
}
} int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("Test.txt", "r", stdin);
#endif // ONLINE_JUDGE scanf("%d%d", &n, &m);
Init();
int cnt = ;
for(int i=; i<n; i++)
for(int j=; j<m; j++)
{
if(matrix[i][j].data && matrix[i][j].status)
{
BFS(matrix[i][j]);
cnt++;
}
}
printf("%d\n", cnt); return ;
}
/*-------------------------迷宫问题--------------------*/
/*
Description:
给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而“.”代表平底,S表示起点,T表示终点。
移动过程中,如果当前位置是(x,y)(下标从0开始),且每次只能前往上下左右四个位置的平地,
求从起点到达终点的T的最小步数; Sample Input:
. . . . .
. * . * .
. * S * .
. * * * .
. . . T *
*/ #include <cstdio>
#include <queue>
using namespace std;
const int MAX_SIZE = ;
struct node
{
char data;
bool status;
int x, y;
int level;
}matrix[MAX_SIZE][MAX_SIZE]; int n, m, X[]={,,,-}, Y[]={,-,,};
void Init()
{
scanf("%d%d", &n, &m);
getchar();
for(int i=; i<n; i++)
{
for(int j=; j<m; j++)
{
matrix[i][j].data = getchar();
getchar();
matrix[i][j].status = true;
matrix[i][j].x = i;
matrix[i][j].y = j;
}
} } int BFS(node s)
{
queue<node> q;
q.push(s);
matrix[s.x][s.y].level = ;
while(!q.empty())
{
node v = q.front();
q.pop();
matrix[v.x][v.y].status = false;
for(int i=; i<; i++)
{
int nowX = v.x+X[i];
int nowY = v.y+Y[i];
if(nowX< || nowX>=n || nowY< || nowY>=m)
continue;
if(matrix[nowX][nowY].data=='.' && matrix[nowX][nowY].status)
{
q.push(matrix[nowX][nowY]);
matrix[nowX][nowY].level = matrix[v.x][v.y].level+;
}
else if(matrix[nowX][nowY].data=='T')
return matrix[v.x][v.y].level;
}
}
return -; //无法到达
} int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("Test.txt", "r", stdin);
#endif // ONLINE_JUDGE Init();
for(int i=; i<n; i++)
for(int j=; j<m; j++)
if(matrix[i][j].data=='S')
printf("%d\n", BFS(matrix[i][j])); return ;
}
广度优先搜索(Breadth First Search)的更多相关文章
- javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)
最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){ var items = {}; this.has = functio ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- (转)广度优先搜索BFS和深度优先搜索DFS
1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...
- 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)
1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...
- [SOJ] 图的广度优先搜索
Time Limit: 1sec Memory Limit:256MB Description 读入图的邻接矩阵以及一个顶点的编号(图中顶点的编号为从1开始的连续正整数.顶点在邻接矩阵的行和列上 ...
- 广度优先搜索(Breadth First Search, BFS)
广度优先搜索(Breadth First Search, BFS) BFS算法实现的一般思路为: // BFS void BFS(int s){ queue<int> q; // 定义一个 ...
- [MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索
一.图 在正式进入广度优先搜索的学习前,先了解下图: 图分为有向图和无向图,由点vertices和边edges构成.图有很多应用,例如:网页爬取,社交网络,网络传播,垃圾回收,模型检查,数学推断检查和 ...
- Javascript —— 有向图广度优先搜索
用Javascript实现有向图的广度优先搜索 刚好遇到一个需求,对于一个有向图,指定一个节点 i 作为起点,输出从 i 出发,可以到达的所有节点,也就是图中以 i 作为起点的子连通片,思考了一下,可 ...
- BFS(一):广度优先搜索的基本思想
广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略. 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的.首先生成第一层 ...
- 关于宽搜BFS广度优先搜索的那点事
以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...
随机推荐
- ORA-06550/PLS-00103
原因是单引号‘是需要加转义字符的(即‘—>“)
- zoom:1总结
zoom:1确实帮我们解决了不少ie下的bug,但是它的来龙去脉,又有多少人知道呢? 所以我老生常谈,说一下它的来龙去脉. Zoom属性是IE浏览器的专有属性, 它可以设置或检索对象的缩放比例.先来一 ...
- python 根据字典的键值进行排序
1.利用key排序 d = {'d1':2, 'd2':4, 'd4':1,'d3':3,} for k in sorted(d): print(k,d[k]) d1 2d2 4d3 3d4 1 2. ...
- java final关键字详解
final是java中保留关键字,可以声明成员变量.类.方法与本地变量,一旦引用final关键字,将不能再改变这个引用,编译器会检查代码,要是想改变该引用,会报错. final变量? 凡是对成员变量或 ...
- Spring Boot中普通类获取Spring容器中的Bean
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,自己动手n ...
- centos7上的h5ai折腾记
过程: 安装php-fpm和nginx,且经验证二者在其他项目可以正常使用. 从debian8拷贝过来_h5ai的nginx配置如下: location ~ [^/]\.php(/|$) { fast ...
- Oracle 环境部署 以及数据库创建 ,用户新建和权限分配
1.右键我的电脑--->属性--->高级系统设置 2.环境变量---->新建 总共配置三个变量 (1)变量名 ORACLE_HOME 变量值 G:\app\TH\product\11 ...
- Gabor滤波器的理解
搬以前写的博客[2014-02-28 20:03] 关于Gabor滤波器是如何提取出特征点,这个过程真是煎熬.看各种文章,结合百度.文章内部的分析才有一点点明白. Gabor滤波器究竟是什么? 很 ...
- codeforces 1B 模拟
题目大意: 给出两种行列位置的表示方法,一个是Excel表示法,一个是(R,C)坐标表示.给出一种表示,输出另外一种表示. 基本思路: 模拟,首先判断是哪一种表示法,然后转换成另外一种表示方法: 我做 ...
- Python的历史及介绍
Python的诞生 Python的创始人吉多·范罗苏姆(Guido van Rossum),在1989年12月的圣诞节期间,为了打发时间,决定开发一种新的脚本解释程序,作为ABC语言的继承. 现在,p ...