搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)

拯救同伴问题

问题描述:假设有如下迷宫,求解从某一点出发到目标位置的最短距离

迷宫

Input:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3

Output:
7


深度优先搜索(DFS)

import java.util.Scanner;public class DFS {static int[][] a = new int[51][51];static int[][] book = new int[51][51];static int n, m, p, q, min = 99999999;static int sum = 1;public static void main(String[] args) {Scanner input = new Scanner(System.in);n = input.nextInt();m = input.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {a[i][j] = input.nextInt();}}int startX = input.nextInt();int startY = input.nextInt();p = input.nextInt();q = input.nextInt();book[startX][startY] = 1;dfs(startX,startY,0);System.out.println(min);}public static void dfs(int x, int y, int step) {/*** 按照右,下,左,上的顺时针顺序遍历* 定义一个方向数组,便于操作* */int[][] next = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int tx, ty;/*** 是否到达目标位置,更新最小值* */if (x == p && y == q) {min = min < step ? min : step;return;}/*** 计算下个点的坐标* */for (int i = 0; i < 4; i++) {tx = x + next[i][0];ty = y + next[i][1];/*** 检查临界* */if (tx < 1 || tx > n || ty < 1 || ty > m) {continue;}/*** 不是障碍物,也未加入路径中,则执行dfs,注意回溯* */if (a[tx][ty] == 0 && book[tx][ty] == 0) {book[tx][ty] = 1;dfs(tx, ty, step + 1);/*** 为了找到最短的路径必须进行回溯* */book[tx][ty] = 0;}}}
}

同样的广度优先搜索(BFS)也可以接这个题目,但是要注意广度优先搜索需要有一个队列Queue来控制。这里需要创建一个Point类来保存坐标和距离。
另外,由于java本身没有提供队列获取队尾元素的api,所以在下面的算法中需要注意处理,方法不唯一。

广度优先搜索(BFS)

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;class Point{public int x;public int y;public int s;Point(int x, int y, int s) {this.x = x;this.y = y;this.s = s;}
}public class BFS {static int[][] a = new int[51][51];static int[][] book = new int[51][51];static Queue<Point> queue = new LinkedList<>();static int n, m, p, q;static int min = 99999999;public static void main(String[] args) {Scanner input = new Scanner(System.in);n = input.nextInt();m = input.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {a[i][j] = input.nextInt();}}int startX = input.nextInt();int startY = input.nextInt();p = input.nextInt();q = input.nextInt();queue.add(new Point(startX, startY, 0));book[startX][startY] = 1;bfs();System.out.println(min);}public static void bfs() {/*** 按照右,下,左,上的顺时针顺序遍历* 定义一个方向数组,便于操作* */int[][] next = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int tx, ty;int flag = 0;while (!queue.isEmpty()) {for (int i = 0; i < 4; i++) {tx = queue.peek().x + next[i][0];ty = queue.peek().y + next[i][1];/*** 临界条件* */if (tx < 1 || tx > n || ty < 1 || ty > m) {continue;}/*** 非障碍物,未标记为1,则进行入队操作* */if (a[tx][ty] == 0 && book[tx][ty] == 0) {/*** 标记为已拓展,不同于DFS的是,BFS每个点只会被拓展一次,无需进行回溯* */min = queue.peek().s + 1;book[tx][ty] = 1;queue.add(new Point(tx, ty, min));}if (tx == p && ty == q) {flag = 1;break;}}if (flag == 1) {/*** 这里要注意的是,每次拓展完,且未到达目标位置时都会移出队首元素一次,* 但是最后一次队列中至少存在两个元素,即正在处理的点,和这个点拓展到的目标* 而直接出队操作是做不到的(即使将出队操作提前也不能实现),而且,* 当大于两个点的时候,一次出队也不能起到实质性的作用* 所以在这里我们在上个判断中直接改变全局变量mark的值即可实现* */break;}queue.remove();}}
}

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

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

相关文章

PHP7.2的安装与配置(win7)

1、PHP的安装 1&#xff09;、环境安装目录&#xff1a; C:/wamp/|——php|——php7.2|——Apache24|——mysql|——www2&#xff09;、下载 linux专用&#xff1a;http://www.php.net/downloads.php windows专用&#xff1a;http://windows.php.net/download/ 官网里Windo…

搜索算法(二)--DFS/BFS求解炸弹人问题(JAVA )

炸弹人问题 问题描述&#xff1a;小人可以在迷宫中任意地方放置一个炸弹&#xff0c;炸弹可以在以该点为中心的十字方向杀死怪物&#xff0c;但是触碰到墙之后不再能传递攻击。求将一个炸弹放在哪个位置可以杀死更多的怪物&#xff1f;&#xff1f; Input&#xff1a; 13 1…

could not find driver和PDO drivers = no value

could not find driver 使用ThinkPHP5.0.20&#xff08;win7apache2.4.41 php7.2.21MySQL5.7&#xff09;连接MySQL数据库时&#xff0c;报错&#xff1a; 然后使用phpinfo();查看了一下扩展&#xff0c;发现了问题&#xff08;PDO drivers 的值为 no value&#xff09;&…

搜索算法(三)--DFS/BFS求解宝岛探险问题(JAVA )

宝岛探险问题 问题描述&#xff1a;某片海域有诸多岛屿&#xff0c;用0表示海洋&#xff0c;1-9表示陆地&#xff0c;现给定一个岛屿上的坐标点&#xff0c;求解所在岛屿的面积 思路&#xff1a;显然这是一个搜索算法&#xff0c;即只要从当前坐标点开始遍历&#xff0c;每遍…

win7上修改MySQL数据库密码

一、通过命令行方式修改MySQL密码 1、方法一&#xff1a;用mysqladmin 格式&#xff1a;mysqladmin -u用户名 -p旧密码 password 新密码 实例&#xff1a;mysqladmin -uroot -pabc password 123456 2、方法二&#xff1a;用set password 首先&#xff0c;登录MySQL数据库。…

Python爬虫从入门到放弃(二十)之 Scrapy分布式原理

原文地址https://www.cnblogs.com/zhaof/p/7306374.html 关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构&#xff0c;只在本机维护一个爬取队列&#xff0c;Scheduler进行调度&#xff0c;而要实现多态服务器共同爬取数据关键就是共享爬取队列。 这里重…

python-入门

Python入门 阅读目录 一 编程与编程语言二 编程语言分类三 主流编程语言介绍四 python介绍五 安装python解释器六 第一个python程序七 变量八 用户与程序交互九 基本数据类型十 格式化输出十一 基本运算符十二 流程控制之if...else十三 流程控制之while循环十四 流程控制之for循…

图论算法(一)--最短路径的DFS/BFS解法(JAVA )

最短路径–城市路径问题&#xff1a; 问题描述&#xff1a;求从1号城市到5号城市的最短路径长度 Input&#xff1a; 5 8 1 2 2 1 5 10 2 3 3 2 5 7 3 1 4 3 4 4 4 5 5 5 3 3 Output&#xff1a; 9 DFS import java.util.Scanner; public class minPath {stati…

win7安装composer

一、下载安装包 二、安装 1、双击安装包进行安装 2、安装选项&#xff0c;点击next 3、选择php.exe的路径 4、选择并next 5、代理 6、准备安装 7、信息 8、安装成功 9、测试是否安装成功 10、安装位置 11、密钥位置 12、添加路径到环境变量 13、配置国内镜…

图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )

一、Dijkstra算法 问题描述&#xff1a;求一个点到任意个点的距离 思路&#xff1a;单源最短路径问题&#xff0c;使用Dijkstra算法 Input&#xff1a; 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 3 4 4 5 13 4 6 15 5 6 4 Output&#xff1a; 0 1 8 4 13 17 imp…

MySQL日志分析

一、MySQL日志简介 &#xff08;一&#xff09;、mysql日志的种类&#xff0c;一般来说&#xff0c;日志有五种&#xff0c;分别为&#xff1a; 错误日志&#xff1a;log_error (记录启动&#xff0c;运行&#xff0c;停止mysql时出现的信息)二进制日志&#xff1a;log_bin &…

图论算法(三)--最短路径 的Bellman-Flod [ 带负权值图 ] 的解法(JAVA )

Bellman-Flod算法 对于带有负权值的图&#xff0c;我们已经不能通过Dijkstra算法进行求解了 原因&#xff1a;Dijkstra每次都会找一个距源点&#xff08;设为s&#xff09;最近的点&#xff0c;然后将该距离定为这个点到源点的最短路径&#xff1b;如果一个顶点u被加入了book…

SpringCloud介绍(一)

1.1 SpringCloud介绍 1.1.1 微服务架构演化 简而言之&#xff0c;微服务就是开发一组小型服务的方式来开发一个独立的应用系统&#xff0c;每个小型服务都运行在自己的进程中&#xff0c;并采用HTTP资源API轻量级的机制来互相通信。这些服务围绕业务功能进行构建&…

最短路径问题总结,时间复杂度,空间复杂度对比(JAVA)

最短路径问题总结 图中还有些地方没有完善&#xff0c;但是一时也没没办法解决&#xff0c;希望大家知道的能够提供一下表中不足的地方&#xff0c;万分感谢&#xff01;&#xff01;&#xff01; 最短路径算法&#xff08;一&#xff09;–DFS/BFS求解&#xff08;JAVA &…

树--树的基本性质(JAVA)

前几篇文章介绍了图的搜索算法&#xff0c;最短路径算法&#xff0c;接下来介绍树&#xff1a; 树和图 树实际上就是不含回路的无向连通图 虽然树不连通&#xff0c;没有回路了&#xff0c;但是这也使得树这种数据结构有了更多的特性&#xff1a; 1.一棵树中的任意两个结点…

看后端程序员调试CORS的姿势

# 目录 为什么有同源策略&#xff1f; 需要解决的问题CORS跨域请求方案 preflightwithCredentials附&#xff1a;高效、优雅地调试CORS实现为什么有同源策略&#xff1f; 同源策略Same Origin Policy 是一种约定&#xff0c;是浏览器最核心的安全功能&#xff1a;该策略允许在…

图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)

之前我们介绍了求最短路径算法&#xff0c;现在又讲最小生成树算法&#xff0c;这两个算法有什么区别呢&#xff1f; 首先要明确&#xff0c;最短路径和最小生成树是两个不同的概念。 最短路径是对于一个图的两个结点而言的。在一个图中&#xff0c;结点A通过某些结点和边可以…

express+handlebars 快速搭建网站前后台

最近在重构公司网站&#xff0c;原来网站使用PHP&#xff0c;前后端不分离&#xff0c;添加与更新网站内容仍使用原始方法&#xff0c;先出布局再把调好的布局给PHP后端开发&#xff0c;花时间长&#xff0c;维护不易。因此决定将网站前后端分离&#xff0c;核心功能含网站下单…

定义一个二维数组并输入数据,将二维数组元素的值按升序排列,并输出排序后的二维数组。

目录 问题&#xff1a; 回顾&#xff1a; 给出两种做法&#xff1a; 解法一&#xff1a;调用qsort 函数进行排序 代码&#xff1a; 运行结果&#xff1a; 解法二&#xff1a;冒泡排序 代码&#xff1a; 运行结果: 回顾里的4种方法的模板参考&#xff1a; 1.冒泡排序…

第五届省赛(软件类)真题----Java大学C组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学C组答案及解析 杨辉三角调和级数回文素数过大年位平方和单位分数n级台阶 一、杨辉三角 二项式的系数规律&#xff0c;我国数学家很早就发现了。 如【图1.png】&#xff0c;我国南宋数学家杨辉1261年所著的《详解九…