BFS算法(Java)_java bfs求最短路径-程序员宅基地

技术标签: 算法  宽度优先  

题目描述

迷宫由 n 行 m 列的单元格组成,每个单元格要么是空地,要么是障碍物。其中1表示空地,可以走通,2表示障碍物。给定起点坐标startx,starty以及终点坐标endx,endy。现请你找到一条从起点到终点的最短路径长度。
输入

第一行包含两个整数n,m(1<=n,m<=1000)。接下来 n 行,每行包含m个整数(值1或2),用于表示这个二维迷宫。接下来一行包含四个整数startx,starty,endx,endy,分别表示起点坐标和终点坐标。
输出

如果可以从给定的起点到终点,输出最短路径长度,否则输出-1。
测试数据

输入

5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
输出

7

 

import java.util.Queue;
import java.util.Scanner;
import java.util.LinkedList;
class point {
	int x,y,step;
	public point(int x,int y,int step){
		this.x=x;
		this.y=y;
		this.step=step;
	}
}
public class Bfs {
	static int[][] a=new int[50][30];//地图
	static int[][] b=new int[50][30];
	static int[][] t= {
   { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }};
	static int startx,starty,endsx,endsy;
	public static void bfs(int x,int y,int step) {
		point p=new point(x,y,step);
		LinkedList<point> q=new LinkedList<point>();
		q.add(p);
		b[x][y]=1;
		boolean flag=false;
		while(!q.isEmpty()) {
			point f=q.peek();
			if(f.x==endsx&&f.y==endsy) {
				flag=true;
				System.out.println(f.step);
				break;
			}
			for(int i=0;i<4;i++) {
				int newx=f.x+t[i][0];
				int newy=f.y+t[i][1];
				int newstep=f.step+1;
				if(a[newx][newy]==0&&b[newx][newy]!=1&&newx>=1&&newy>=1) {
					point newp=new point(newx,newy,newstep);
					q.add(newp);
					b[newx][newy]=1;
				}
			}
			q.remove();
		}
		if(flag==false) {
			System.out.print(-1);
		}
	}
	
//	1 1 
//	4 3
//	0 0 1 0
//	0 0 0 0
//	0 0 1 0
//	0 1 0 0
//	0 0 0 1
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		startx=scan.nextInt();
		starty=scan.nextInt();
		endsx=scan.nextInt();
		endsy=scan.nextInt();
		for(int i=1;i<6;i++) {
			for(int j=1;j<5;j++) {
				a[i][j]=scan.nextInt();
			}
		}
		scan.close();
		bfs(startx,starty,0);
	}
}

体悟:数组一直越界,搞了很长时间才弄明白(中午也没睡觉,现在十分的困倦),原来是犯了在写DFS的错误,数组的默认值为0,开始写的条件之中写的是不为1,即没有访问过就可以往上下左右四个方向移动,但是地图边界也为0,当访问点在边界上的上下左右的时候就数组越界了,所以解决这个问题也可以用下列种形式

import java.util.Queue;
import java.util.Scanner;
import java.util.LinkedList;
class point {
	int x,y,step;
	public point(int x,int y,int step){
		this.x=x;
		this.y=y;
		this.step=step;
	}
}
public class Bfs {
	static int[][] a=new int[50][30];//地图
	static int[][] b=new int[50][30];
	static int[][] t= {
   { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }};
	static int startx,starty,endsx,endsy;
	public static void bfs(int x,int y,int step) {
		point p=new point(x,y,step);
		LinkedList<point> q=new LinkedList<point>();
		q.add(p);
		b[x][y]=2;
		boolean flag=false;
		while(!q.isEmpty()) {
			point f=q.peek();
			if(f.x==endsx&&f.y==endsy) {
				flag=true;
				System.out.println(f.step);
				break;
			}
			for(int i=0;i<4;i++) {
				int newx=f.x+t[i][0];
				int newy=f.y+t[i][1];
				int newstep=f.step+1;
				if(a[newx][newy]==0&&b[newx][newy]==1) {
					point newp=new point(newx,newy,newstep);
					q.add(newp);
					b[newx][newy]=2;
				}
			}
			q.remove();
		}
		if(flag==false) {
			System.out.print(-1);
		}
	}
	
//1 1 
//4 3
//0 0 1 0
//0 0 0 0
//0 0 1 0
//0 1 0 0
//0 0 0 1
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		startx=scan.nextInt();
		starty=scan.nextInt();
		endsx=scan.nextInt();
		endsy=scan.nextInt();
		for(int i=1;i<6;i++) {
			for(int j=1;j<5;j++) {
				a[i][j]=scan.nextInt();
				b[i][j]=a[i][j]+1;
			}
		}
		scan.close();
		bfs(startx,starty,0);
	}
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_59519985/article/details/129711378

智能推荐

30岁想转行,该怎么开始?_30岁跨行从零开始-程序员宅基地

文章浏览阅读234次。有人说过“跳槽穷仨月,转行穷三年”,足以可见好工作难找,转行更是难上加难。如何在这样严峻的形势下成功实现转行?显得尤为重要了。_30岁跨行从零开始

VSCode代码自动补全html标签、css样式属性值 - 解决VSCode没有代码提示 - 修改配置文件即可完成 - 无需插件_vscode css 嵌套写法 没有提示补全-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏12次。操作步骤如下:第一步:打开设置找到下图的位置,取消选中 Suggeest: Snippets Prevent Quick Suggestions第二步:找到 settings.json 打开编辑第三步:将以下代码放到里面即可:"files.associations": { "*.vue": "html" }效果图如下:..._vscode css 嵌套写法 没有提示补全

Anaconda3安装graphviz失败及解决方法_file "d:\anaconda\lib\site-packages\graphviz\base.-程序员宅基地

文章浏览阅读4k次。​ 基本思想:从根节点出发,测试不同的特征属性,按照结果的不同选择分支,最终落到某一叶子节点,获得分类结果。 Graphviz是一个绘图工具集, 可以用The DOT Language的 DSL 来绘图。用 dot 写好脚本之后,使用不同的布局引擎来对脚本解析,生成图片,支持 PNG、PDF 等格式。Graphviz 有好几个布局引擎,一般使用的有dot(有向图) 和circo(环..._file "d:\anaconda\lib\site-packages\graphviz\base.py", line 32, in __str__ r

Vue - 超详细实现文字上下滚动功能效果,类似网站公告文字循环翻滚、中将人员名单公布上下无限滚动效果(支持鼠标移入时悬停停止滚动、接口动态数据渲染、自由DIY样式等)_vue - 超详细实现文字上下滚动功能效果,类似网站公告文字循环翻滚、中将人员名单-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏4次。vue文字上下翻滚,vue实现文字上下滚动,vue公告栏文字上下滚动效果代码,vue2如何做类似网站公告的文字上下翻滚动,vue怎么写文字上下来回交替滚动功能,vue2公告栏上下滚动,vue实现公告栏文字上下滚动效果,vue实现多个滚动公告,鼠标移入停止滚动,Vue中实现文字向上滚动的动画效果_vue2文字向上循环滚动,Vue2写文本上下无限滚动以及文本左右无限滚动的效果,vue2如何实现文字上下滚动跑马灯效果,vue2实现文字滚动效果,一条滚动完毕下一条从下面往上滚动,vue2动态文字滚动公告代码,vue_vue - 超详细实现文字上下滚动功能效果,类似网站公告文字循环翻滚、中将人员名单

centos7-x86_64 kernel 4.18 安装_centos7 kernel 4.18-程序员宅基地

文章浏览阅读1.8k次。#.下载 4.18 rpm合集压缩包wget https://gitee.com/ysj001/public/raw/master/kernel-4.18.16.tar.gz# 解压tar zxvf kernel-4.18.16.tar.gz#安装yum install -y *rpm_centos7 kernel 4.18

爬虫爬取小说_番茄小说爬取-程序员宅基地

文章浏览阅读1.8k次,点赞12次,收藏11次。通过对网页结构分析,发现文字有一些超出了编码范围,于是可以推断出,字体暗藏玄机,找到网页字体文件后,下载到本地,用Fontforge打开,发现只从e3e8到e55b有文字,所以可以得出番茄使用了两套字体加载文本内容,当字符超出一定范围,就使用另一种。通过观察层级结构,我们使用xpath语法 //div[@class=“muye-reader-content noselect”]/div//p 获得文章内容,到此,所以需要的信息已经爬完了,只需要处理循环逻辑,保存文件就行。获取内容如图,具有乱码。_番茄小说爬取

随便推点

常见的Markdownpad2运行破解以及This view has crashed!报错和Awesomium1.6.6SDK安装使用_awesomium 1.6.6 sdk-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏7次。MarkDownPad2安装地址:MarkdownPad2: 安装点击此链接.提示:需等待一两秒即可MarkdownPad2报错提示This view has crashed:打开MarkdownPad2编辑器之后会出现界面右边无法渲染,并提示错误This view has crashed,这时您需要安装组件Awesomium1.6.6SDK。提示:Awesomium 1.6.6 SDK安装:Awesomium 1.6.6 SDK: 安装点击此链接.之后重启MarkdownPad2一下,_awesomium 1.6.6 sdk

[RK3288][Android6.0] 调试笔记 --- pmu(rk818)寄存器读写【转】-程序员宅基地

文章浏览阅读174次。本文转载自:http://blog.csdn.net/kris_fei/article/details/76919134Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92rk的pmu模块只提供了每次单个寄存器的读写,驱动提供了这个节点供使用:/sys/rk818/rk818_test 举例:读取:echo r 0x23 ..._mtk_perf_plus

【机器学习】高斯回归过程GPR_高斯过程回归 kriging-程序员宅基地

文章浏览阅读418次。我是知识的搬运工_高斯过程回归 kriging

[Win32SDK基本]ListView Controls(1)Report (details) View 详解_syslistview32l 换行-程序员宅基地

文章浏览阅读7k次,点赞5次,收藏16次。本文由CSDN用户zuishiko所作,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/46872885老规矩,先上MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/bb774737(v=vs.85).aspx其实还是子窗口,static那节_syslistview32l 换行

QT 网络编程(一)-程序员宅基地

文章浏览阅读1.1k次,点赞38次,收藏20次。Qt 网络编程相关

软工视频总结-程序员宅基地

文章浏览阅读614次。经过十天的时间,对软工视频进行一下简单的总结。软工视频总共有24讲,一讲大约50分钟。前3章介绍软工视频的历史。 第 6 讲 1.需求分析的任务就是借助于当前系统的逻辑模型导出目标系统的逻辑模型,解决,目标系统的“做什么”的问题。 2.问题识别的另一项工作是建立分析所需要的通信途径,以保证能顺利地对问题进行分析。