广度优先搜索(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是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...
随机推荐
- Oracle中使用REGEXP_SUBSTR,regexp_replace,wm_concat函数
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...
- java并发编程笔记(三)——线程安全性
java并发编程笔记(三)--线程安全性 线程安全性: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...
- JS-动态加载
var s = document.createElement('script'); s.setAttribute('src', ''); s.setAttribute('type', 'text/ja ...
- Ubuntu16.04搜狗拼音输入法候选栏无法显示中文(英文乱码)
输入中文时,若候选栏显示英文乱码.无法显示中文,如下图所示,可按如下方式处理: cd ~/.config rm -rf SogouPY* sogou* 然后注销重新登录即可.
- PAT甲级——A1145 HashingAverageSearchTime【25】
The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...
- Loadrunner test web service which need username and password
Action(){ char * position; char * str; int offset; char * search_str = "ERROR"; // web_s ...
- spark textFile读取多个文件
1.spark textFile读取File 1.1 简单读取文件 val spark = SparkSession.builder() .appName("demo") .mas ...
- 热修复设计之CLASS_ISPREVERIFIED(二)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从CLASS_ISPREVERIFIED实战来介绍热 ...
- Spring Boot实现通用的接口参数校验
Spring Boot实现通用的接口参数校验 Harries Blog™ 2018-05-10 2418 阅读 http ACE Spring App API https AOP apache IDE ...
- Pyhton第八节 字典补充
Python 字典的基本元素是键值对(key-value), 每个键值对的key和value之间用:分割:每个键值对之间用,分割:整个键值对用花括号{}包围 字典内的键(key)必须唯一,值不需要唯一 ...