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第四次作业—面向对象高级特性(继承和多态)

    Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...

  2. Ajax,ajax封装

    /** * Created by liyinghao on 2016/8/23. */ /*仿jQuery中的ajax方法,简单版实现;封装ajax的工具函数*/ /* * 1 请求方式 type g ...

  3. 人工智能-动物识别专家系统算法Python + Pyqt 实现

    一.基础知识库 有毛发 哺乳动物 - 有奶 哺乳动物 - 有羽毛 鸟 - 会飞 会下蛋 鸟 - 吃肉 食肉动物 - 有犬齿 有爪 眼盯前方 食肉动物 - 哺乳动物 有蹄 有蹄类动物 - 哺乳动物 反刍 ...

  4. 树的重心(DFS)

    ;vector< ; i < v[node].size() ; i++){ , ; i <= n- ; i++){ cin >> a >> b; v[a].p ...

  5. spring data jpa 关联设计

    MAP关联实体 // @ElementCollection @OneToMany(cascade = {CascadeType.ALL})// @JoinColumn(name = "the ...

  6. Android组件内核之Fragment管理与内核(二)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下三个内容来介绍Fragment管理与内核: [Fragm ...

  7. c# Winform实现发送邮件

    邮件发送类 来源网上 稍作调整...出处忘了 /** * 命名空间: EmailSend * 类 名: EmailSend * * 作者        变更内容            变更日期 * ─ ...

  8. 用dialog包制作窗口

    #!/bin/bash temp=$(mktemp -t test.XXXXXX) temp2=$(mktemp -t test.XXXXXX) function diskspace { df -k ...

  9. UML各种线的含义

    内容目录: 从一个示例开始 类之间的关系 时序图 附录:<图说设计模式> 看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之 ...

  10. php常见的验证方法

    php常见的验证方法 干货文章 ·2018-03-16 23:50:36 <?php /** * @param $id * @return false|int * 检测id */ functio ...