迷宫问题(java实现)
1、
public class Direction {
private int x;
private int y;
public Direction(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
2、
public class Position {
private int x;
private int y;
private int d;
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return this.y;
}
public void setY(int y) {
this.y = y;
}
public Position(int x, int y, int d) {
this.x = x;
this.y = y;
this.d = d;
}
public int getD() {
return this.d;
}
public void setD(int d) {
this.d = d;
}
}
3、
import java.util.Iterator;
import java.util.Stack;
public class MazeProblem {
public static Stack<Position> path(int[][] maze, Direction[] move) {
Stack<Position> s = new Stack<Position>();
// 起点位置 还未开始探索所以无方向
Position start_p = new Position(1, 1, -1);
s.push(start_p);
maze[1][1] = -1; // 起点位置表示已经走过,不可以往回探索,pop的时候 可以退回
while (!s.empty()) {
Position temp = s.pop(); // 取出当前的位置 准备进行向下探索
// 确定探索的位置方向
int x = temp.getX(); // 当前处在正在探索的位置和方向
int y = temp.getY();
int d = temp.getD() + 1;// 探索的方向
while (d < 8) { // 开始探索 一共八个方向
int i = x + move[d].getX(); // 根据某个方向探的下一个位置
int j = y + move[d].getY();
if (maze[i][j] == 0) { // 如果下一个位置是可以进去的,则放入当前位置
s.push(new Position(x, y, d));
x = i; // 把当前探索位置 调整为放入的位置
y = j;
d = 0; // 调整方向为0,为下次探索做准备
maze[x][y] = -1; // 然后设置为已走过
if (x == Destination.m && y == Destination.n) { // 在判断是不是已经是终点位置 如果是 则程序退出
s.push(new Position(x, y, d));
return s;
}
} else {
d++; //// 如果下一个位置是不可以进去的,则放入调整方向
}
}
}
return new Stack<Position>();
}
//终点位置
static class Destination {
static int m = 6;
static int n = 8;
}
public static void main(String[] arg) {
// 0表示可进入 1 表示 不可以进去 -1 表示走过的路劲也不可进入
// 每个位置 都有八个方向
int[][] maze = {
// 0 1 2 3 4 5 6 7 8 9
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, //
{ 1, 0, 1, 1, 1, 0, 1, 1, 1, 1 }, //
{ 1, 1, 0, 1, 0, 1, 1, 1, 1, 1 }, //
{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 }, //
{ 1, 0, 1, 1, 1, 1, 1, 0, 1, 1 }, //
{ 1, 1, 0, 0, 1, 1, 1, 1, 0, 1 }, //
{ 1, 0, 1, 1, 0, 0, 0, 0, 0, 1 }, //
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } //
};
Direction[] move =
{
new Direction(0, 1),
new Direction(1, 1),
new Direction(1, 0),
new Direction(1, -1),
new Direction(0, -1),
new Direction(-1,-1),
new Direction(-1, 0),
new Direction(-1, 1)
};
Stack<Position> s = MazeProblem.path(maze, move);
Iterator<Position> it = s.iterator();
while (it.hasNext()) {
Position e = it.next();
System.out.println(e.getX() + ",-->" + e.getY());
}
}
}
迷宫问题(java实现)的更多相关文章
- 小项目特供 简易迷宫(基于Java)
明天返校,于是昨天和今天简单熟系了一下JAVA的GUI,做了一个简易的迷宫小游戏(暂时没有时间实现随机迷宫及多关卡,仅供学习) 源码及运行文件(提供JRE8):链接:简易迷宫 密码:hy8v
- hdu 1272 小希的迷宫(java实现)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java迷宫游戏
缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...
- HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索
转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5568822.html 第一次遇到迷宫搜索,给我的感觉是十分惊喜的:搞懂这个的话,感觉自己又掌握了一项技能~ 个人 ...
- Java与算法之(12) - 老鼠再闯迷宫(广度优先算法)
贪吃的小老鼠又回来了,这次有什么新的办法吃到奶酪呢? 规则不变,只能上下左右在格子内移动. 因为上次的深度优先算法让老鼠走了不少冤枉路,这次老鼠带来了帮手探路鼠.探路鼠的使用规则如下: 小老鼠按右.下 ...
- Java与算法之(5) - 老鼠走迷宫(深度优先算法)
小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...
- 剑指Offer——回溯算法解迷宫问题(java版)
剑指Offer--回溯算法解迷宫问题(java版) 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路. 下面我们来详细讲一 ...
- Java————迷宫问题
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. package algorithm_java; import java. ...
随机推荐
- Git——使用gitignore建立项目过滤规则
在进行协作开发代码管理的过程中,常常会遇到某些临时文件.配置文件.或者生成文件等,这些文件由于不同的开发端会不一样,如果使用git add . 将所有文件纳入git库中,那么会出现频繁的改动和push ...
- 原生js 操作类名
添加类名: document.getElementById('navBar').getElementsByClassName('mui-tab-item')[0].classList.add('mui ...
- java泛型 7 泛型的基本介绍和使用
现在开始深入学习Java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用.泛型在java中,是一个十分重要的特性,所以要好好的研究下. 一.泛型的基本概念 泛型的定义:泛型是 ...
- 【Python3 爬虫】05_安装Scrapy
Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛.框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容 ...
- Ant 风格路径表达式(转)
ANT通配符有三种: 通配符 说明 ? 匹配任何单字符 * 匹配0或者任意数量的字符 ** 匹配0或者更多的目录 例子: URL路径 说明 /app/*.x 匹配(Matches)所有在app路径下的 ...
- [1-7] 把时间当做朋友(李笑来)Chapter 7 【从此时此刻开始改变】 摘录
大多数事情都需要提前准备,也都可以提前准备.认识到这一点本身就几乎是一切改变的起点. 任何动作演练到一定的次数,就能做到甚至在无意识的情况下都可以准确完成的地步.而他只不过是把这个原理应用到了极致而已 ...
- Flume、Kafka、Storm结合
Todo: 对Flume的sink进行重构,调用kafka的消费生产者(producer)发送消息; 在Sotrm的spout中继承IRichSpout接口,调用kafka的消息消费者(Consume ...
- 自己学Docker:4.開始了解Docker的工作模式
上一章在学习中有2个疑问: 怎样保存我们在容器里的改动? 假设apt-get假设不能安装时,怎样在Docker中安装软件? 关于run创建的容器问题 对于第一个问题.原来每次运行(当非root用户时, ...
- Phaser实现源代码剖析
Phaser是一个能够反复利用的同步栅栏.功能上与CyclicBarrier和CountDownLatch相似,只是提供更加灵活的使用方法.也就是说,Phaser的同步模型与它们几乎相同. 一般运用的 ...
- 使用swap 清空vector
//最简单的使用swap,清除元素并回收内存 vector <int>().swap(vecInt); //清除容器并最小化它的容量, // vecInt.swap(vector<i ...