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)的更多相关文章

  1. javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)

    最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){ var items = {}; this.has = functio ...

  2. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  3. (转)广度优先搜索BFS和深度优先搜索DFS

    1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...

  4. 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

  5. [SOJ] 图的广度优先搜索

    Time Limit: 1sec    Memory Limit:256MB Description 读入图的邻接矩阵以及一个顶点的编号(图中顶点的编号为从1开始的连续正整数.顶点在邻接矩阵的行和列上 ...

  6. 广度优先搜索(Breadth First Search, BFS)

    广度优先搜索(Breadth First Search, BFS) BFS算法实现的一般思路为: // BFS void BFS(int s){ queue<int> q; // 定义一个 ...

  7. [MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索

    一.图 在正式进入广度优先搜索的学习前,先了解下图: 图分为有向图和无向图,由点vertices和边edges构成.图有很多应用,例如:网页爬取,社交网络,网络传播,垃圾回收,模型检查,数学推断检查和 ...

  8. Javascript —— 有向图广度优先搜索

    用Javascript实现有向图的广度优先搜索 刚好遇到一个需求,对于一个有向图,指定一个节点 i 作为起点,输出从 i 出发,可以到达的所有节点,也就是图中以 i 作为起点的子连通片,思考了一下,可 ...

  9. BFS(一):广度优先搜索的基本思想

    广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略. 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的.首先生成第一层 ...

  10. 关于宽搜BFS广度优先搜索的那点事

    以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...

随机推荐

  1. Java学习之Static

    Static(静态)是一种修饰符,用于修饰成员(成员变量.成员函数) 1.静态方法只能访问静态成员. 2.静态随着类的加载而加载 通过代码分析: class PersonDemo { public s ...

  2. msf generate exec payload

    daniel@daniel-mint ~/msf/metasploit-framework $ ruby msfpayload windows/exec CMD=calc.exe N WARNING: ...

  3. Python Numpy 矩阵级基本操作(1)

    NumPy的操作介绍 import numpy as np #导入numpy包,简写为np print "Generate 1*10 matrix" a=np.arange(1,1 ...

  4. 前端学习笔记——引入css文件、样式优先级

    CSS样式的引用方式有三种:行间样式表>内部样式表>外部样式表. 如果只有一种样式,那么优先级“由内到外 由近到远” 1.行间样式表--内联方式 内联方式指的是直接在 HTML 标签中的  ...

  5. 第一记 搭建Java集成开发环境

    一.JDK JDK可以前往oracle官网进行下载并进行安装(我这边使用的是jdk1.8版本,也推荐使用jdk1.8及以上的) 下图是默认路径安装完成后的截图 安装完成会产生这两个文件夹 二.配置环境 ...

  6. redis 入门之列表

    lpush 将一个或多个值 value 插入到列表 key 的表头如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPU ...

  7. 实用的Python(2)利用Python制作gif动图

    一.简介 moviepy是一个专门用于视频剪辑制作的模块,可以自动化完成很多繁琐的视频剪辑处理工作,除了处理视频数据之外,moviepy中还内置了可以制作gif动图的功能,通过使用moviepy.ed ...

  8. Android开发——回调(Callback)

    1. 回调函数的定义: 在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A ...

  9. Web开发进阶

    1.可靠性 可扩展性,服务降级,负载均衡   应用扩展 1.垂直扩展,方式:提升机器硬件,缺点,成本昂贵,扩展能力有限 2.水平扩展,方式:增加节点,优点:升级过程平花,硬件成本低,理论上无线扩展,确 ...

  10. Linux运行jar包

    要运行java的项目需要先将项目打包成war包或者jar包,打包成war包需要将war包部署到tomcat服务器上才能运行.而打包成jar包可以直接使用java命令执行. 在linux系统中运行jar ...