广度优先搜索(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是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...
随机推荐
- windows下Mysql5.7表名不区分大小写问题
前言 Windwos文件系统本身是不区分大小写的,但是Linux文件系统是支持大小写的.于是安装在Linux下的Mysql导出到windows下可能因为大小写问题导致错误,因此要开启window下My ...
- 89、tensorflow使用GPU并行计算
''' Created on May 25, 2017 @author: p0079482 ''' # 分布式深度学习模型训练模式 # 在一台机器的多个GPU上并行训练深度学习模型 from date ...
- find pattern
daniel@daniel-mint ~/msf/metasploit-framework/tools $ ruby pattern_create.rb 2000 Aa0Aa1Aa2Aa3Aa4Aa5 ...
- PAT_A1104#Sum of Number Segments
Source: PAT A1104 Sum of Number Segments (20 分) Description: Given a sequence of positive numbers, a ...
- 运维 03 Linux之文档与目录结构
Linux之文档与目录结构 Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到 ...
- python学习笔记:使用freeze命令迁移模块
使用freeze 给所有模块搬家 导出安装模块的文档pip freeze > my_freeze.txt 或者指定地址pip freeze > e:\my_freeze.txt 在另一个环 ...
- POI教程
很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告.有时,一个应用程序甚至希望将Excel文件作为输入数据.例如,一个公司开发的应用程序将财务部门需要所有输出生成自己的Ex ...
- 制作 macOS High Sierra U盘
制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统) 随着苹果 macOS High Sierra 正式版发布,很多使用 Mac 电脑的同学都已升级到最新 ...
- CVE-2010-4258漏洞分析
Nelson Elhage最近发现了一个内核设计上的漏洞, 通过利用这个漏洞可以将一些以前只能dos的漏洞变成可以权限提升的漏洞. 当fork一个进程在的时候, copy_process执行如下操作: ...
- python--知识小结和集合
知识小结 一. = 表示赋值 ==表示比较值的大小 is 比较内存地址 二. 数字小数据池:在-5~256之内,id在电脑里是一样的 字符串id一样要求: ①:不能有特殊字符 ②:s(一个单字符)*2 ...