android广度优先查询图片,广度优先搜索(Breadth First Search, BFS)

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

BFS算法实现的一般思路为:

// BFS

void BFS(int s){

queue q; // 定义一个队列

q.push(s); // 队首元素入队

while (!q.empty()){

// 取出队首元素top

// 访问队首元素

// 将队首元素出队

// 将top的下一层结点中未曾入队的结点全部入队,并设置为已入队

}

}

常见题型一:

55ecc02c09e9f746d2888744209b2bda.png

代码实现:

#include

#include

using namespace std;

const int maxn = ;

// 位置结构体

struct node{

int x, y; // 位置(x, y)

}Node;

int n, m; // 矩阵大小为 n * m

int matrix[maxn][maxn]; // 01 矩阵

bool inq[maxn][maxn] = { false }; // 记录位置 (x, y) 是否已入过队

int X[] = { , , , - }; // 增量数组

int Y[] = { , -, , };

// 判断坐标(x, y)是否需要访问

bool judge(int x, int y){

// 越界访问false

if (x >= m || x < || y >= n || y < ){

return false;

}

// 当前位置为0或者已经入过队也返回false

if (matrix[x][y] == || inq[x][y] == true){

return false;

}

// 否则返回 true

return true;

}

// BFS函数访问位置(x, y)所在的块,将该块的所有'1'的inq都设置为 true

void BFS(int x, int y){

// 定义一个队列

queue Q;

// 队首元素入队

Node.x = x, Node.y = y;

Q.push(Node);

// 队列不为空则一直循环

while (!Q.empty()){

// 取出队首元素

node top = Q.front();

// 访问队首元素

// 弹出队首元素

Q.pop();

// 将这个元素所相连的坐标设置为已入队

for (int i = ; i < ; i++){

int newX = top.x + X[i];

int newY = top.y + Y[i];

if (judge(newX, newY)){

Node.x = newX, Node.y = newY;

// 将所有相连坐标入队

Q.push(Node);

inq[newX][newY] = true; // 设置位置[newX, newY]为已入过队

}

}

}

}

int main()

{

// 读取输入

scanf("%d %d", &m, &n);

for (int i = ; i < m; i++){

for (int j = ; j < n; j++){

scanf("%d", &matrix[i][j]); // 读入 01 矩阵

}

int ans = ; // 存放块数

// 遍历矩阵

for (int x = ; x < m; x++){

for (int y = ; j < n; y++){

// 入过位置为1 且没有入过队则计数器加一

if (matrix[x][y] == && inq[x][y] == false){

ans++;

BFS(x, y);

}

}

}

}

printf("%d\n", ans);

return ;

}

常见题型二:

e4c51c4d13c5586b04b7a98d02e22695.png

代码实现:

#include

#include

using namespace std;

const int maxn = ;

struct node{

int x, y;

int step; // step 为从起点到终点位置最少的步数(即层数)

}S, T, temp;

int m, n; // n 为行, m位列

char maze[maxn][maxn]; // 迷宫信息

bool inq[maxn][maxn] = { false };

int X[] = { , , , - };

int Y[] = { , -, , };

// 检测位置(x, y)是否有效

bool test(int x, int y){

if (x >= m || x < || y >= n || y < )

return false;

if (maze[x][y] == '*' || inq[x][y] == true)

return false;

return true;

}

int BFS(){

queue q;

q.push(S);

while (!q.empty()){

node top = q.front();

if (top.x == T.x && top.y == T.y)

return top.step;

q.pop();

for (int i = ; i < ; i++){

int newX = top.x + X[i];

int newY = top.y + Y[i];

if (test(newX, newY)){

// 创建一个新结点

node temp;

temp.x = newX, temp.y = newY;

temp.step = top.step + ;

q.push(temp);

inq[newX][newY] = true;

}

}

}

return -;

}

int main()

{

scanf("%d %d", &m, &n);

for (int i = ; i < m; i++){

for (int j = ; j < n; j++){

maze[i][j] = getchar();

}

maze[i][n] = '\0';

}

scanf("%d %d %d %d", &S.x, &S.y, &T.x, &T.y);

S.step = ;

printf("%d\n", BFS());

return ;

}

数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...

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

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

算法与数据结构基础 - 广度优先搜索&lpar;BFS&rpar;

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

&lbrack;SOJ&rsqb; 图的广度优先搜索

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

&lpar;转&rpar;广度优先搜索BFS和深度优先搜索DFS

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

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

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

常用算法2 - 广度优先搜索 &amp&semi; 深度优先搜索 &lpar;python实现&rpar;

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

【js数据结构】图的深度优先搜索与广度优先搜索

图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this ...

&lbrack;MIT6&period;006&rsqb; 13&period; Breadth-First Search &lpar;BFS&rpar; 广度优先搜索

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

随机推荐

初学C&num;和MVC的一些心得&comma;弯路&comma;总结&comma;还有教训&lpar;2&rpar;--关于Entity Framework

看了一堆视频教程后,感觉基本了解的差不多了,可以动手.....因为最好的学习方法就是实践嘛.... 所以打算从网站做起,在WebForm和MVC之间选了MVC,因为感觉高大上...也比较灵活 于是买了 ...

BOM的来源是不可能出现的字符,GB2312双字节高位都是1,Unicode理论的根本缺陷导致UTF8的诞生

Unicode字符编码规范   http://www.aoxiang.org 2006-4-2 10:48:02Unicode是一种字符编码规范 . 先从ASCII说起.ASCII是用来表示英文字符的 ...

非常有用的Java程序片段

1.向文件末尾添加内容 BufferedWriter out = null; try { out = new BufferedWriter(new FileWriter(”filename”, tru ...

苹果被拒的血泪史。。。(update 2015&period;11)

项目提交了N此了,也审核N次了,苹果的审核机制依旧那么不急不慢.昨天刚刚又被拒了.回忆下之前的,总结一下吧. 2015.04.28 昨天被拒非常亏,app的评级是17+,但是在app展示图里有一个比较 ...

Maven 工程下 Spring MVC 站点配置 &lpar;三&rpar; C3P0连接池与&commat;Autowired的应用

Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 前两篇文章主要是对站点和数据库操作配置进行了演示,如果单 ...

magento中的各种form标签

1. Text Field    $fieldset->addField('title', 'text', array(          'label'     => Mage::hel ...

Linq序列间的操作

一.Union并集操作相同的数据只显示一次 二.Concact连接 相同的数据也会重复显示 三.except差集 我有的你没有的显示 四.intersect交集相同的显示 五.zip序列的合并 六.d ...

MFC的两个问题

1.启动WinApp的时候,报 ASSERT(AfxGetThread() == NULL)错误依赖的MFC DLL工程设置里面加上_USRDLL2. MFC误报内存泄露全局对象释放的问题,添加mfc ...

ASP&period;NET Core 统一异常处理和返回

业务场景: 业务需求要求,需要对 ASP.NET Core 异常进行统一处理和返回,比如出现 500 错误和业务服务错误进行不同的处理和返回. 具体实现: using Microsoft.AspNet ...

mysql防注入

1.对用户输入的数据进行过滤 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取. 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值