JAVA算法:解救小哈(JAVA版)

有一天,小哈一个人去玩迷宫。但是方向感不好的小哈很快就迷路了。小哼得知后便去解救无助的小哈。此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈。那么,问题来了...

迷宫地图表示:0—表示通路;1—表示障碍

第一组用例:

输入迷宫坐标
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

小哈的位置:(3,2)

输出

7

第二组用例:

输入迷宫坐标
1 1 1 
0 1 0 
0 1 0

输出

No Way!


算法分析

迷宫表示

0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

方向定义

1,1 1,2 1,3
2,1 2,2 2,3
3,1 3,2 3,3

设定一个坐标系的话,如下方格所示:

  (X-1,Y)  
(X,Y-1) (X,Y) (X,Y+1)
  (X+1,Y)  

也就是说纵向用X轴表示,横向用Y轴表示。这个坐标轴非常重要,因为我们以此构建方向数组:

     //搜索顺序:右,下,左,上int[][] next=new int[][] {{0,1},//向右走{1,0},//向下走{0,-1},//向左走{-1,0} //向上走};

算法设计

package com.bean.algorithm.dfsbfs;import java.util.LinkedList;public class HelpXiaoHa {/*** 定义迷宫数组*/private int maxY = 4;private int maxX = 5;int min=Integer.MAX_VALUE;int endX=3;int endY=2;int[][] maze=new int[maxX][maxY];int[][] mark=new int[maxX][maxY];LinkedList<Integer> map=new LinkedList<Integer>();/** 初始化迷宫* */public void initMaze() {this.maze = new int[][] {{ 0, 0, 1, 0 },{ 0, 0, 0, 0 },{ 0, 0, 1, 0 },{ 0, 1, 0, 0 },{ 0, 0, 0, 1 }};this.mark=new int[maxX][maxY];this.mark[0][0]=1;//输出迷宫地图,其中: * 代表障碍物;_代表可以通过for(int x=0;x<maxX;x++) {for(int y=0;y<maxY;y++) {if(x==endX && y==endY) {System.out.print("! ");}else if(this.maze[x][y]==1) {System.out.print("* ");}else {System.out.print("_ ");}}System.out.println();}System.out.println();}public void dfs(int startX,int startY,int step) {//搜索顺序:右,下,左,上int[][] next=new int[][] {{0,1},//向右走{1,0},//向下走{0,-1},//向左走{-1,0} //向上走};int nextX;int nextY;int posible;//判断是否达到小哈的位置if(startX==endX && startY==endY) {//判断是否用了最少的步数stepsif(step<min) {min=step;}for(int i=map.size()-1;i>=0;i-=2) {nextX=map.get(i);nextY=map.get(i-1);System.out.print("["+nextX+","+nextY+"]");if(i!=1) {System.out.print("->");}}System.out.println();return;}for(posible=0;posible<next.length;posible++) {//顺序:右,下,左,上//计算下一个点的坐标nextX=startX+next[posible][0];nextY=startY+next[posible][1];//判断是否越界if(nextX<0||nextX>=maxX||nextY<0||nextY>=maxY) {continue;}if(maze[nextX][nextY]==0 && mark[nextX][nextY]==0) {map.push(nextX);map.push(nextY);mark[nextX][nextY]=1;dfs(nextX,nextY,step+1); //递归调用,移动到下一格子mark[nextX][nextY]=0;map.pop();map.pop();}}}public static void main(String[] args) {// TODO Auto-generated method stubHelpXiaoHa help=new HelpXiaoHa();int startX=0;int startY=0;long startTime=System.currentTimeMillis();help.initMaze();help.dfs(startX, startY, 0);if(help.min<Integer.MAX_VALUE) {System.out.println("At least "+help.min+" steps.");}else {System.out.println("No Way!");}long endTime=System.currentTimeMillis();System.out.println("Elapsed time: "+(endTime-startTime)+" ms.");}}

程序运行结果:

_ _ * _ 
_ _ _ _ 
_ _ * _ 
_ * ! _ 
_ _ _ *

[0,1]->[1,1]->[1,2]->[1,3]->[2,3]->[3,3]->[3,2]
[0,1]->[1,1]->[2,1]->[2,0]->[3,0]->[4,0]->[4,1]->[4,2]->[3,2]
[0,1]->[1,1]->[1,0]->[2,0]->[3,0]->[4,0]->[4,1]->[4,2]->[3,2]
[1,0]->[1,1]->[1,2]->[1,3]->[2,3]->[3,3]->[3,2]
[1,0]->[1,1]->[2,1]->[2,0]->[3,0]->[4,0]->[4,1]->[4,2]->[3,2]
[1,0]->[2,0]->[2,1]->[1,1]->[1,2]->[1,3]->[2,3]->[3,3]->[3,2]
[1,0]->[2,0]->[3,0]->[4,0]->[4,1]->[4,2]->[3,2]
At least 7 steps.
Elapsed time: 4 ms.

JAVA算法:解救小哈(JAVA版)相关推荐

  1. 啊哈算法-DFS解救小哈python版

    DFS 啊哈算法-解救小哈 maze_map = [] n,m = map(int,(input()).split()) maze_map = [input().split() for i in ra ...

  2. Java算法学习:java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制)

    java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制) 这几天在复习C语言的数据结构栈和队列那一章的时候,看到利用栈的特性FILO实现的进制转换十分简洁 想起了java中实现栈的操作十分 ...

  3. 啊哈算法—解救小哈(广度优先搜索)

    解救小哈 小哈在一个(m * n)大小的迷宫(0 ⇐ m, n ⇐ 50)里迷路了.在迷宫中,每个单元格要么是空地,要么是障碍物.现在要找到从起点到小哈位置的最短步数. 思路: 使用队列储存扩展,扩展 ...

  4. 悲哀!面试现场,简单几道java算法题,90%程序员没写出来

    这两天小编逛论坛的时候发现一个很有意思的事情,就是一位互联网公司的面试官分享的,他们最近想招一批java的实习生,所以他们的面试题并不难,但是前来面试的人,却很多都挂在了几道算法题上,要么就是逻辑不严 ...

  5. 惊!面试现场,简单几道java算法题,90%程序员没写出来

    近几个月很多大学实习生离校找实习工作去了,本以为自己很值钱,实际上发现自己并不值钱,想象着自己能赚很多钱了,结果只能拿到一点微薄的工资,很多人会怪公司给的少,但是你有没有想过,你自己的技术值多少钱?你 ...

  6. 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》

    文章目录 0.前言 1.功能 2.示例 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来 ① 实现原理 ② 实现代码 ③ 性能分析 0. ...

  7. IDEA配置java《算法》第四版环境(耗时6小时,总算配置成功了,希望能给大家一点帮助)

    0.前言 最近在学java语言,然后想用java语言来学习算法,在网上听说看<算法>第四版学习java算法不错,于是就去下载了<算法>电子书来啃 今天看到了用java java ...

  8. Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

    在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12 ...

  9. Java算法:牛客网Java版剑指Offer全套算法面试题目整理及电子档,Java算法与数据结构面试题,面试刷题、背题必备!牛客网剑指offer

    剑指offer(java版) 牛客网Java版剑指Offer全套题目67道 资源来源于网络 目录 1.二维数组中的查找 2.替换空格 3.从尾到头打印链表 4.重建二叉树 5.用两个栈实现队列 6.旋 ...

最新文章

  1. 首发 | 旷视14篇CVPR 2019论文,都有哪些亮点?
  2. 实现快速排序的算法_排序算法-快速排序
  3. 对Unity的Resources目录进行改名
  4. windows配置samba客户端_如何搭建与Windows客户机结合使用的Samba文件服务器?
  5. 《容器技术系列》一1.4 Docker运行案例分析
  6. Linux基础(firewalld防火墙配置管理工具的图形用户界面)
  7. Facebook轮播连结广告可展示5个图像与连结
  8. php连接mysql数据库失败_PHP远程连接MySQL数据库失败之原因
  9. javamelody监控java项目_使用javamelody监控javaEE
  10. 转盘抽奖小程序java_大转盘抽奖小程序版 转盘抽奖网页版
  11. 东山再起的男人一般都有这七个表现
  12. 深度卷积对抗神经网络 基础 第六部分 缺点和偏见 GANs Disadvantages and Bias
  13. jQuery插件开发全解析,jQuery.extend , (function($){ , $.fn.pluginName
  14. c# 利用AForge.NET组件操作摄像头
  15. 笔记本电脑桌面壁纸变全黑,没有任务栏
  16. 360怎样修改wifi服务器地址,360路由器怎么改wi-fi密码(无线密码)? | 192路由网
  17. 【ACWing】1064. 小国王
  18. Day8 打卡第八天
  19. 01.Gameplay Architecture ECS简介
  20. 报告 | 腾讯知文,从0到1打造下一代智能问答引擎【CCF-GAIR】

热门文章

  1. 迅雷该怎么把区块链这件事做好?
  2. 这只“鸭子不一般”科大讯飞申请“躺倒鸭”商标
  3. openGL参数曲面----二次贝塞尔曲线
  4. 基于单片机智能婴儿车控制设计(毕业设计)
  5. SDEdit一点成画,小白也能是绘画大师!
  6. 设计模式之桥接模式:如何实现抽象协议与不同实现的绑定?
  7. android开发笔记之2012版辅助开发工具包(ADT)新功能特性介绍及安装使用
  8. ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植
  9. 美团外卖小哥竟开发阿里云盘,抢先首发
  10. 如何将图片的背景色去掉?怎样快速去除背景色?