一个求迷宫入口到出口最近距离的程序 JAVA版本

牛客网——Kotori和迷宫 广搜 阅读详情


本文给出一个JAVA 语言版的求迷宫入口到出口的最短路径的程序。程序的大部分使用标准c语言编写,包括
输入和输出。唯一用到C++库的地方是使用STL了中的deque。迷宫的宽和高,迷宫矩阵,迷宫的入口和出口
等数据从文件读入。程序首先读入迷宫数据,然后更新迷宫矩阵,并求出迷宫入口和出口之间的最短路径,
并输出最短路径长度。

C++版本的在这里: http://blog.youkuaiyun.com/liangbch/article/details/7595177


开始时,迷宫矩阵的每一个元素是0或-1,0表示可走,-1表示是墙,走不通。对所有和迷宫入
口相通的方格,其值被改为其距迷宫入口的最近距离(比如:5*5的矩阵)

{ 0,  0,  0,  0,  0},    
{-1,  0, -1,  0, -1},    
{ 0,  0, -1, -1, -1},    
{ 0, -1,  0,  0,  0},    
{ 0,  0,  0, -1,  0},


2.算法

  迷宫的矩阵的每一方格可用 MazeNode表示,里面最重要的是三个数字(x,y,d)来表示,x,y表示这个方格的坐标,d表示这个方格距入口
的距离.

  1.首先,将入口的坐标(x,y,0),放入双端队列my_queue。
  2. 接下来重复以下的过程,直到队列为空:

    2.1.从队列头部取出一个MazeNode,三元组(x,y,d)
    2.2.从右,下,左,上四个方向搜索找最相邻的一个节点, :

       如果是 -1的格子(就是墙),则跳过;如果这个方格不是入口点,则有3种情况
      case 1.
      新方格对应的矩阵元素是0,表明新的方格距迷宫入口的距离尚未标记。
   则将新方格对应的矩阵元素设置为d+1,同时将三元组(x,y,d+1)入队
      case 2:
      新方格的对应的矩阵元素的值>d+1,表明该新方格距迷宫入口的距离已经标记但不是最近的。
   则将新方格对应的矩阵元素设置为d+1,同时将三元组(x,y,d+1)入队  
     case 3:
     如果新的方格的对应的矩阵元素<= d+1,该位置距入口的距离已经标记,则不做处理

  3.检查出口对应的矩阵元素M[exit.x][exit.y]的值,如果为0,表示没有一条路径可走,否则打印出
    口距入口的距离。

全部的代码见下:

package algorithm;
import java.util.*;
public class MazeShow {
     public static class MazeNode {	
	/* 0 means it is not processed yet or it is entrance point
	 * >0 means the shortest distance from the entrance node  
	 */
	private int distance; 
	/*
	 * data: it is setup during initialization phase.
	 * -1: means this node is wall.
	 * 0: means it can be went through.
	 */
	private int data;
	private int row;
	private int column;
	boolean isStartPoint;
	boolean isExitPoint;
	
	public MazeNode(){
		distance=0;
		data=0;
		column=0;
		row=0;
		isStartPoint=false;
		isExitPoint=false;
	}
	public int getRow(){
		return row;
	}
	public int getColumn(){
		return column;
	}
	public void setRow(int row){
		this.row=row;
	}
	public void setColumn(int column){
		this.column=column;
	}
	public int getDistance(){
		return distance;
	}
	public void setData(int data){
		this.data=data;
	}	
	public void setDistance(int dis){
		distance=dis;
	}
	public int getData(){
		return data;
	}	
	public void setStartPoint(boolean value){
		isStartPoint=value;
	}
	public void setEndPoint(boolean value){
		isExitPoint=value;
	}
	public boolean getStartPoint(){
		return isStartPoint;
	}
	public boolean getEndPoint(){
		return isExitPoint;
	}
   }
    
	public static int getMazeShortestDistance(){	
	   int MAZE_WIDTH=5;
	    int MAZE_HEIGHT=5;
	    int distance=0;
	    MazeShow.MazeNode[][] mymaze=new MazeShow.MazeNode[MAZE_HEIGHT][MAZE_WIDTH];
	    for(int height=0;height<MAZE_HEIGHT;height++)
	      for(int width=0;width<MAZE_WIDTH;width++) {
	    	  //Java OBJ array must create new each obj element after TYPE[][] m=new TYPE[5]6];
	    	  mymaze[height][width]=new MazeShow.MazeNode();
	    	  mymaze[height][width].setRow(height);
	    	  mymaze[height][width].setColumn(width);
	      }
	    
	    //set up as(0,0) as entrance point 
	    
	    mymaze[0][0].setData(0);
	    mymaze[0][0].setDistance(0);
		
	    //set up as(MAZE_WIDTH-1,MAZE_HEIGHT-1) as exit point 
		
	    mymaze[MAZE_HEIGHT-1][MAZE_WIDTH-1].setData(0);
	    mymaze[MAZE_HEIGHT-1][MAZE_WIDTH-1].setDistance(0);
	    
	    //set maze as below which is wall
	    /*
	     *   
       { 0,  0,  0,  0,  0},    
       {-1,  0, -1,  0, -1},    
       { 0,  0, -1, -1, -1},    
       { 0, -1,  0,  0,  0},    
       { 0,  0,  0, -1,  0},
	     * 
	     */
	    mymaze[1][0].setData(-1);
	    
	    mymaze[3][1].setData(-1);
	    
	    mymaze[1][2].setData(-1);
	    mymaze[2][2].setData(-1);
	    
	    mymaze[2][3].setData(-1);
	    mymaze[4][3].setData(-1);
	    
	    mymaze[1][4].setData(-1);
	    mymaze[2][4].setData(-1);
	    
	    //process now
	    Queue<MazeShow.MazeNode> mazequeue = new LinkedList<MazeShow.MazeNode>();
	    
	    //push the entrance point as start point
	    
	    mazequeue.offer(mymaze[0][0]);
	    MazeShow.MazeNode pnode=null;
	    
	    int pcolumn=0;
		int prow=0;
		MazeShow.MazeNode currentNode=null;
		
	    while(!mazequeue.isEmpty()) {
	    	//get the FIFO node from queue;
	    	currentNode=null;
	    	pnode=mazequeue.poll();
	    	
	    	for(int turn=0;turn<4;turn++) {
	    	 switch(turn) {
	    	  case 0: //left
	    		  if(pnode.getColumn()>0) {
	    			 pcolumn=pnode.getColumn()-1;
	 	    		 prow=pnode.getRow();
	 	    		 currentNode=mymaze[prow][pcolumn];
	    		   }
	    		  else 
	    			  currentNode=null;  
	    		    break;
	    	 case 1: //down	    		 
	 	    	  if(pnode.getRow()<(MAZE_HEIGHT-1)) {
	 	    		// not the lowest node
	 	    		pcolumn=pnode.getColumn();
		 	    	prow=pnode.getRow()+1;
		 	    	currentNode=mymaze[prow][pcolumn];
	 	    	  }
	 	    	  else 
	    			  currentNode=null;  
	    		    break;
	    	 case 2: //right 
	 	    	 if(pnode.getColumn()<(MAZE_WIDTH-1)) {
	 	    		// not the most right node
	 	    		 pcolumn=pnode.getColumn()+1;
	 	    		 prow=pnode.getRow();
	 	    		 currentNode=mymaze[prow][pcolumn];
	 	    	  }
	 	    	 else 
	    			  currentNode=null;  
	    		   break;
	    	 case 3: //up
	 	    	  if(pnode.getRow()>0) {
	 	    		 pcolumn=pnode.getColumn();
	 	    		 prow=pnode.getRow()-1;
	 	    		 currentNode=mymaze[prow][pcolumn];
	 	    	  } else
	 	    		 currentNode=null;  
	    		    break;
	    		    
	    	 default:
	    		   System.out.println("error, shall not reach here");
	    		   return -1;
	    	 }	
	    	 
	    	 if(currentNode==null)
	    		 continue;
	    	 //skip the wall node
	    	  if(currentNode.getData()== -1)
	    		 continue;
	    	
	    	  distance=currentNode.getDistance();
	    	  if(distance==0 && (!currentNode.getStartPoint())){
	    			  //this is node not processed yet and it is not startpoint
	    		   currentNode.setDistance(pnode.getDistance()+1);
	    		   mazequeue.offer(currentNode);
	    	  } 
	    	  else { if(distance>(pnode.getDistance()+1)){
	    				  //update to make it shorted
	    			 currentNode.setDistance(pnode.getDistance()+1);
	  	    		 mazequeue.offer(currentNode);
	    		     } 
	    	        else { //if distance < (pnode.getDistance()+1
	    		    	    //nothing to do	    		    	 
	    		     }	    			  
	    		  }	    			  
	    		}
	    	}
	    
		return (distance= mymaze[MAZE_HEIGHT-1][MAZE_WIDTH-1].getDistance());
	}
}


实验三 迷宫的创建 阅读详情

相关推荐

今日刷三题(day14):ISBN号码+kotori和迷宫+矩阵最长递增路径

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。

qq_66767167的博客 1396

7-7 求解迷宫从入口到出口的路径 (15 分) java

求解迷宫从入口到出口的路径。输入一个迷宫,求从入口通向出口的可行路径。为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0&lt

qq_53369749的博客 2256

【数据结构与算法】之深入解析“迷宫中离入口最近的出口”的求解思路与算法示例

一、题目要求 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 ‘.’ 表示)和墙(用 ‘+’ 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。 每一步操作,你可以往上、下、左或者右移动一个格子,不能进入墙所在的格子,也不能离开迷宫。你的目标是找到离 entrance 最近的出口,出口的含义是 maze 边界上的空格子,entrance 格子不算出口。 请你返回

╰つ栺尖篴夢ゞ 1万+

追梦算法----走出迷宫的最短路径

说明 有n*m的迷宫,该迷宫有一个入口,一个出口。编写一程序打印一条从迷宫入口到出口的最短路径,黑色方块的单元表示走不通(用1表示),白色方块的内容表示走的通(用0表示) 只能往上下左右四个方向走,如果有最短路径,保证最短路径一定是唯一的,如果没有路径可以到达,则输出“no way”。 输入格式 第一行输入2个整数n和m(n和m都是10~150之间的整数),代表迷宫的行数和列数 接下来n行,每行有m个整数,1代表不可走的点,0代表可走的点 接下来一行,有2个整数s1和s2代表入口的坐标 接下来一行,有

今天会营业的博客 1642

求迷宫的最短路径:现要求设计一个算法找一条从迷宫入口到出口的最短路径。

本算法要求找一条迷宫的最短路径,算法的基本思想为:从迷宫入口点(1,1)出发,向四周搜索,记下所有一步能到达的坐标点;然后依次再从这些点出发,再记下所有一步能到达的坐标点,…,依此类推,直到到达迷宫的出口点(m,n)为止,然后从出口点沿搜索路径回溯直至入口。这样就找到了一条迷宫的最短路径,否则迷宫无路径。

指定出口和入口的迷宫

在一个指定的迷宫里,出口和入口指定,找到一条路出去

leetcode 5793. 迷宫中离入口最近的出口(C++、java、python)

给你一个m x n的迷宫矩阵maze(下标从 0 开始),矩阵中有空格子(用'.'表示)和墙(用'+'表示)。同时给你迷宫的入口entrance,用entrance = [entrancerow, entrancecol]表示你一开始所在格子的行和列。 每一步操作,你可以往上,下,左或者右移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离entrance最近的出口。出口的含义是maze边界上的空格子。entrance格子不算出口。...

qq_27060423的博客 608

java实现的求迷宫最短路径算法

用java实现的求迷宫最短路径的算法源代码,代码中有大量注释,容易看懂

LeetCode——1926. 迷宫中离入口最近的出口(Nearest Exit from Entrance in Maze)[中等]——分析及代码(Java)

LeetCode——1926. 迷宫中离入口最近的出口[Nearest Exit from Entrance in Maze][中等]——分析及代码[Java]一、题目二、分析及代码1. 广度优先搜索(1)思路(2)代码(3)结果三、其他 一、题目 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 ‘.’ 表示)和墙(用 ‘+’ 表示)。同时给你迷宫的入口 entrance&nbsp

江南土豆的博客 977

用矿卡P104-100在PVE 8.0.4上跑Ollama:保姆级显卡直通与驱动安装避坑指南

本文详细介绍了如何在PVE 8.0.4环境下通过显卡直通技术,利用矿卡P104-100高效部署本地大模型Ollama的全流程。从硬件配置、BIOS设置到驱动安装和性能调优,提供了保姆级的避坑指南和实战解决方案,特别针对矿卡无显示输出的特殊性进行了优化。

weixin_33228769的博客 747

STM32+W5500实战:5分钟搞定FreeModbus TCP移植(附完整代码)

本文详细介绍了如何在STM32微控制器上,结合W5500以太网芯片,快速完成FreeModbus TCP协议栈的移植,构建稳定可靠的工业级Modbus TCP服务器。内容涵盖硬件连接、软件架构、驱动适配、核心移植代码实现及调试优化技巧,旨在提供可直接应用于实际项目的完整解决方案。

life6的博客 878

5793. 迷宫中离入口最近的出口

title: 5793. 迷宫中离入口最近的出口 date: 2021-07-11 00:41:16 tags: [leetcode] 5793. 迷宫中离入口最近的出口 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。 每一步操作,你可以往 上,下,左 或者 右 移动一个格子。.

F_Just 404

支持向量机算法(带你了解原理 实践)

支持向量机作为一种强大的分类算法,在各个领域都取得了显著的成果。其基于统计学习理论的原理使得它能够在高维空间中找到最优分类超平面,并通过核函数处理非线性问题。

2303_79387663的博客 3736

LeetCode_BFS_中等_1926.迷宫中离入口最近的出口

给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrance~row~, entrance~col~] 表示你一开始所在格子的行和列。 每一步操作,你可以往 上,下,左 或者右移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离 entrance 最近的出口。出口的含义是 maze 边界上的空格子。entrance 格子不算出口。

代码星辰的博客 477

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

从GAN生成失败案例出发:为什么你的AI画不准位置?CoordConv保姆级解决方案

本文深入探讨了GAN生成图像时位置偏移问题的根源,并提供了CoordConv的保姆级解决方案。通过分析传统CNN在空间坐标建模上的缺陷,详细介绍了CoordConv的原理、实现步骤及在StyleGAN2等模型中的实战应用,显著提升了医学图像生成等任务的定位精度。

pp12345的博客 204

【LeetCode】1926.迷宫中离入口最近的出口

class Solution { public int nearestExit(char[][] maze, int[] entrance) { // 初始化可走的四个方向 List<int[]> step = new ArrayList<>(); step.add(new int[]{0, 1}); step.add(new int[]{0, -1}); step.add(new int[]{.

trancybao的博客 420

目前最新NIST随机数测试软件下载、安装、及使用教程

最近由于科研需要,在搞一些随机数的测试的事情,众所周知 随机数测试我们可以使用NIST的软件进行多大15项的随机测试,我也在网上查找了很多大牛的博客,但是都是年代久远,很多的链接现在都是物是人非,都是不能直接使用了,今天顺便抽点时间更新一下这个NIST软件的下载及使用。我们首先讲一下该软件的下载:1.我们直接取NIST的官网(https://csrc.nist.gov/)下载即可 ;链接如下:下载...

Miracle.Zhao的博客 3万+

1926. 迷宫中离入口最近的出口【{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} 探索】

1926. 迷宫中离入口最近的出口

long_steve的博客 377

Python调用CANoe(1)(启动与停止,变量和信号读写)

CANoe因为其封闭性(Vector独有),开发的时候,有很多局限性;Python 因为其开源,容易上手,功能强大,那么Python 和 CANoe结合会产生怎样的火花呢?

蚂蚁小兵 4万+

Amesim应用篇-电芯等效电路模型标定

为了使计算模型更加准确,在有电芯实验测试数据的情况下,依据现有的实验数据对Amesim中的电池等效电路模型进行标定。标定的目的是为了获得更加符合项目实际情况的电芯等效电路模型,标定完的电芯可以用于搭建PACK模型,也可以用于其他虚拟实验。本文以充电标定为例,进行介绍。放电标定与充电一致。

2201_75375391的博客 1213

牛客网 - [北京信息科技大学第十一届程序设计竞赛]kotori和迷宫(BFS)

题目链接:https://ac.nowcoder.com/acm/contest/940/D/ 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口。kotori只能上下左右四个方向移动。她想知道有多少出口是她能...

ityanger的技术栈 3350

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迷宫最近距离

广搜代码如下:import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { public static final int[][] maze = new int[][] { {0,1,0,0,0,1,1,1,0,...

aodubi0638的博客 111

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

(算法)迷宫中离⼊⼝最近的出⼝————<BFS>

【代码】(算法)迷宫中离⼊⼝最近的出⼝————<BFS>

2301_79580018的博客 412

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

2026年--Lc343-1926. 迷宫中离入口最近的出口(图 - 广度优先搜索)--java版

(3)按层 BFS:从入口开始,每次扩展一圈,ans 记录当前圈的步数;第一次走到边界的可走格就是最近出口,直接返回 ans;//创建一个 List<int[]>,并把一个二维坐标 (beginX, beginY)(用 int[] 表示)放进去作为列表的第一个元素。(1)每次从当前位置 (x,y) 走到相邻四格。vis 用于防止重复入队导致死循环/超时。(2)初始化:行列、访问数组、入口坐标。

zsysingapore的博客 94
上一篇: prefix wsdp is not bound to a namespace
下一篇: 什么叫线程安全
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值