广度优先算法BFS

package myalgorithm;import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
/*BFS用于记录的位置和值的结构*/
class node
{node(int xparam,int yparam,int valparam){this.x = xparam;this.y = yparam;this.value = valparam;}int x,y,value;
}
public class ShortPath {/*全局最短路径*/public int stepnum = 999;/*构建11*11的迷宫,英雄H在(1,1)的位置出发,去解救美女M(6,8)*/char[][] graph = {{'#','#','#','#','#','#','#','#','#','#','#'},{'#','H','_','_','*','_','_','*','_','_','#'},{'#','_','_','_','_','_','_','_','_','_','#'},{'#','_','*','_','_','_','*','_','_','_','#'},{'#','_','_','_','*','_','_','_','_','*','#'},{'#','_','_','_','_','_','_','*','_','*','#'},{'#','_','*','_','_','_','_','_','M','_','#'},{'#','*','_','_','*','_','_','_','_','_','#'},{'#','_','_','_','_','_','_','_','_','_','#'},{'#','_','_','_','*','_','_','_','_','_','#'},{'#','#','#','#','#','#','#','#','#','#','#'},};/*初始标记数组都为0*/public int[][] mark = new int[graph.length][graph.length];/*每一个位置有四种选择:右下左上*/public int[][] choose = {{0,1},{1,0},{0,-1},{-1,0}};/*BFS算法*/public void BFS(node startPoint){//起始点装入队列Queue<node> queue = new LinkedList<node>();startPoint.value = 1;//确保起始步数为1
        queue.offer(startPoint);node t1;int tx,ty;top:while(!queue.isEmpty()){//取队首,出队后不再入队,value也自此固定t1 = queue.poll();mark[t1.x][t1.y] = t1.value;//标记步数for(int i=0;i<4;i++){tx = t1.x + choose[i][0];ty = t1.y + choose[i][1];//找到美女,肯定是最短的,可以立即返回if(graph[tx][ty] == 'M'){stepnum = t1.value + 1;//下一步可到mark[tx][ty] = stepnum;break top;}//继续接着找,把空路径添加到队列末尾//不是炸弹和围墙,并且没有被标记if(graph[tx][ty] != '#' && graph[tx][ty] != '*'&&mark[tx][ty] == 0){queue.offer(new node(tx,ty,t1.value+1));}}}}/*BFS回溯路径*/private void getPath(node target) {int beforex = 0,beforey = 0;int x = target.x;int y = target.y;for(int i=0;i<4;i++){beforex = x + choose[i][0];beforey = y + choose[i][1];//找到英雄的出发点,函数结束if (beforex == 1 && beforey == 1){return;}if(mark[x][y] - 1 == mark[beforex][beforey]){System.out.print("("+beforex+","+beforey+")<--");break;}}getPath(new node(beforex,beforey,0));return;}
/*main函数*/
public static void main(String[] args) {ShortPath my = new ShortPath();long start = System.currentTimeMillis();my.BFS(new node(1,1,0));long end = System.currentTimeMillis();System.out.println("BFS step: " + my.stepnum + " time:" + (end-start));//打印标记结果for (int m = 0;m<my.graph.length;m++)System.out.println(Arrays.toString(my.mark[m]));//打印巡回路径my.getPath(new node(6,8,0)); }}

BFS step: 13 time:4
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 0, 7, 8, 0, 10, 11, 0]
[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0]
[0, 3, 0, 5, 6, 7, 0, 9, 10, 11, 0]
[0, 4, 5, 6, 0, 8, 9, 10, 11, 0, 0]
[0, 5, 6, 7, 8, 9, 10, 0, 12, 0, 0]
[0, 6, 0, 8, 9, 10, 11, 0, 13, 0, 0]
[0, 0, 10, 9, 0, 11, 0, 0, 0, 0, 0]
[0, 0, 11, 10, 11, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
(5,8)<--(4,8)<--(4,7)<--(4,6)<--(4,5)<--(3,5)<--(3,4)<--(3,3)<--(2,3)<--(2,2)<--(2,1)


 

扩展:

PhotoShop中的魔术棒选择工具的原理,就是从鼠标选中的点作为种子,并加入队列;依次查找周边的点,如果颜色与种子颜色相近,则加入队列;对队列中的元素依次进行类似扩展,这样就选取了与最初种子颜色相同的点的集合。

转载于:https://www.cnblogs.com/mingziday/p/4827796.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

COMA(一): Learning to Communicate with Deep Multi-Agent Reinforcement Learning 论文讲解

Learning to Communicate with Deep Multi-Agent Reinforcement Learning 论文讲解 论文链接&#xff1a;https://papers.nips.cc/paper/6042-learning-to-communicate-with-deep-multi-agent-reinforcement-learning.pdf &#xff08;这篇论文是COMA三部曲中的第&#xff08…

C和指针之指针数组和指向数组的指针

1、指针数组 定义一个指针数组&#xff0c;该数组中每个元素是一个指针&#xff0c;每个指针指向哪里就需要程序中后续再定义int *p[10]; 2、指向数组的指针 定义一个数组指针&#xff0c;该指针指向含10个元素的一维数组&#xff08;数组中每个元素是int型&#xff09;int (*p…

SSH 远程执行任务

SSH 是 Linux 下进行远程连接的基本工具&#xff0c;但是如果仅仅用它来登录那可是太浪费啦&#xff01;SSH 命令可是完成远程操作的神器啊&#xff0c;借助它我们可以把很多的远程操作自动化掉&#xff01;下面就对 SSH 的远程操作功能进行一个小小的总结。远程执行命令如果我…

分库分表之历史表如何选择最佳分片路由规则

前言先别急着关闭,我相信这篇文章应该是所有讲分表分库下的人都没有和你们讲过的一种分片模式,外面的文章基本上都是教你如何从零开始分片,现在我将讲解的是如何从1开始分片项目地址github地址 https://github.com/dotnetcore/sharding-coregitee地址 https://gitee.com/dotnet…

C和指针之二维字符串数组用指针数组、数组指针、二级指针打印

1、问题 二位字符串数组用指针数组、数组指针、二级指针打印 2、测试代码 #include <stdio.h>int main() {char value[4][5] = {"chen", "yu", "feng", "yy"};char *p[5];char (*p1)[5];char **p2;//把二位数组的值赋给指…

Android下强制打开软键盘

这个也是累人&#xff0c;网上查了很多方法&#xff0c;没有实现需求。 最后的实现方法很简单。代码&#xff1a; 1 //通过定时器强制打开虚拟键盘2 public static void TimerShowKeyboard(final View v)3 {4 Timer timer new Timer();5 timer.schedu…

COMA(二):Counterfactual Multi-Agent Policy Gradients 论文讲解

Counterfactual Multi-Agent Policy Gradients 论文链接&#xff1a;https://arxiv.org/pdf/1705.08926.pdf 1. 问题提出&#xff08;解决了什么问题&#xff1f;&#xff09; 在现实世界中&#xff0c;有非常多的问题需要多个单位之间的“合作”才能完成任务&#xff0c;这就…

lecture6-mini批量梯度训练及三个加速的方法

Hinton的第6课&#xff0c;这一课中最后的那个rmsprop&#xff0c;关于它的资料&#xff0c;相对较少&#xff0c;差不多除了Hinton提出&#xff0c;没论文的样子&#xff0c;各位大大可以在这上面研究研究啊。 一、mini-批量梯度下降概述 这部分将介绍使用随机梯度下降学习来训…

C和指针之判断参数在关键字字符串列表中是否匹配

1、题目 *判断参数是否与一个关键字列表任何单词匹配 *并返回匹配的索引值,如果没有找到返回-1 2、代码实现 #include <stdio.h> #include <stdlib.h> #include <string.h>/***判断参数是否与一个关键字列表任何单词匹配*并返回匹配的索引值,…

Dapr集成之GRPC 接口

Dapr 为本地调用实现 HTTP 和 gRPC API 。通常大家第一时间想到的是通过 gRPC 调用 Dapr&#xff0c;更重要的一点是Dapr 也可以通过 gRPC 与应用程序通信。要做到这一点&#xff0c;原理很简单&#xff0c;应用程序需要托管一个gRPC服务器&#xff0c;并实现 Dapr 的GRPC 规范…

jQuery Validate验证框架详解

jQuery Validate验证框架详解 jQuery校验官网地址&#xff1a;http://bassistance.de/jquery-plugins/jquery-plugin-validation 一、导入js库 <script type"text/javascript" src"<%path %>/validate/jquery-1.6.2.min.js"></script> &…

C和指针之数组之编程练习2

1、题目 2.美国联邦政府使用下面这些规则计算1995年每个公民的个人收入所得税: 输入大于 不超过 你的税额为 超过这个数额的部分 $0 $2335015% $0 23350 56550 3502.50+28% 23350 56550 117950 12798.50+31% 56550 117950 2…

spring中的BeanFactory与ApplicationContext的作用和区别?

作用&#xff1a;1. BeanFactory负责读取bean配置文档&#xff0c;管理bean的加载&#xff0c;实例化&#xff0c;维护bean之间的依赖关系&#xff0c;负责bean的声明周期。 2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外&#xff0c;还提供了更完整的框架功…

基于centos7系统mongodb3.,4.4安装

下载安装mongodbwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.4.tgztar zxvf mongodb-linux-x86_64-rhel70-3.4.4.tgzmv mongodb-linux-x86_64-rhel70-3.4.4 mongodb344配置mongodbcd mongodb344/ mkdir data mkdir logsvim /opt/mongodb344/mongod…

RNN入门笔记

本笔记来源自Youtube李宏毅老师的RNN视频归纳&#xff0c;主要分为以下几个知识点: RNN 的特点RNN 的几种实现方法 (Simple RNN, LSTM)RNN 的训练不稳定性RNN 的keras实现 (定长和变长输入案例) Recurrent Neural Network Feature of RNN Differ from normal Neural Networ…

Swift - 文本输入框(UITextField)的用法

1&#xff0c;文本框的创建&#xff0c;有如下几个样式&#xff1a; UITextBorderStyle.None&#xff1a;无边框UITextBorderStyle.Line&#xff1a;直线边框UITextBorderStyle.RoundedRect&#xff1a;圆角矩形边框UITextBorderStyle.Bezel&#xff1a;边线阴影1234var textFi…

WPF 基础控件之 DatePicker 样式

此群已满340500857 &#xff0c;请加新群458041663由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。支持NugetInstall-Package WPFDevelopers.Minimal -Version 3.2.001—代码如下一、创建…

C和指针之数组编程练习3(判断矩阵是否为单位矩阵)

1、题目 3.单位矩阵就是一个正方形矩阵,它除了主对角线元素值为1以外,其余元素的值均为0,例如: *1 0 0 *0 1 0 *0 0 1 *就是一个33单位矩阵,编写一个名叫identity_matrix的函数,它接受一个1010整型矩阵为参数 *成功返回1,失败返回1 4、修改前一个问题中的identity_…

stagefright框架(四)-Video Buffer传输流程

這篇文章將介紹Stagefright中是如何和OMX video decoder传送buffer。 (1) OMXCodec會在一開始的時候透過read函式來傳送未解碼的data給decoder&#xff0c;並且要求decoder將解碼後的data傳回來 status_t OMXCodec::read(...){ if (mInitialBufferSubmit) { mInitialBuffe…

微信支付四大支付模式分别有哪些区别?

微信支付是集成在微信客户端的支付功能&#xff0c;用户可以通过手机完成快速的支付流程。微信支付已为百货、餐厅、便利店、酒店、快递、景区、医院、售货机等提供了支付与营销的全方位支持。 目前微信支付已实现刷卡支付、扫码支付、公众号支付、APP支付&#xff0c;并提供企…