广度优先搜索(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 用户概念与基本操作
目录 目录 Oracle的用户 通过系统用户来登陆SQLPlus system和sys的区别 查看登陆的用户 启用和锁定一个用户 启用用户 锁定用户 创建用户 修改用户 删除用户 角色权限 常用的用户 ...
- PHP面试 javascript和jQuery 基础
JavaScript基础 JavaScript语法 变量的定义:变量必须以字母开头 可以使用$和 _ 符号开头 变量名称对大小写敏感 使用 var 关键词声明变量 可以一次声明多个变量 ...
- 【Vue】---Vue.config常用配置项
一.前言 Vue-cli3 搭建的项目 相比较Vue-cli2界面相对较为简洁,之前的build和config文件夹不见了,那么应该如何配置 如webpack等的配呢? 二.基本配置 只需要在项目的根 ...
- Django框架(十九)—— drf:序列化组件(serializer)
目录 序列化组件 一.利用for循环来实现序列化(繁琐) 二.利用Django提供的序列化组件(不可控需要的字段) 三.利用drf提供的序列化组件 1.基于Serializer类实现序列化--基本语法 ...
- vue中按需引入mint-UI报Error: .plugins[3][1] must be an object, false, or undefined
{ "presets": ["@babel/preset-env", "@babel/preset-react"], "plugi ...
- 几个比较好的IT站和开发库官网
1.IT技术.项目类网站 (1)首推CodeProject,一个国外的IT网站,官网地址为:http://www.codeproject.com,这个网站为程序开发者提供了很好的代码示例以及讲解,不过 ...
- shell编程:字符串练习题string.sh
string.sh脚本 #!/bin/bash # string="Bigdata process framework is Hadoop,Hadoop is an open source ...
- python基础【第六篇】
list列表 基本结构 lst =[1,2,3,5,6] 为什么学列表? 列表能够存储比字符串更多的数据 列表能够存储各种数据类型 列表的注意点 列表是有序的 列表是可变的,支持索引,切片,步 切片后 ...
- Python安装和使用教程(windows)
点击进入幕布视图浏览 https://mubu.com/doc/a8VGCUfqqw 一.Python下载 1.进入Python官网:https://www.python.org/ 2.选择windo ...
- vue组件库的基本开发步骤
市面上目前已有各种各样的UI组件库,比如 Element 和 iView,他们的强大毋庸置疑.但是我们面临的情况是需求越来越复杂,当它们不能再满足我们需求的时候,这个时候就有必要开发一套属于自己团队的 ...