java实现迷宫问题
迷宫问题
对于走迷宫,人们提出过很多计算机上的解法。深度优先搜索、广度优先搜索是使用最广的方法。生活中,人们更
愿意使用“紧贴墙壁,靠右行走”的简单规则。
58
下面的代码则采用了另一种不同的解法。它把走迷宫的过程比做“染色过程”。
假设入口点被染为红色,它的颜色会“传染”给与它相邻的可走的单元。
这个过程不断进行下去,如果最终出口点被染色,则迷宫有解。
仔细分析代码中的逻辑,填充缺少的部分。把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应
题号的“解答.txt”中即可。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
class Cell{ // 单元格
int row; // 哪行
int col; // 哪列
Cell from; // 开始点
public Cell(int row,int col,Cell from){
this.row = row;
this.col = col;
this.from = from;
}
}
public class T04 {
static char[][] maze = {
{'#','#','#','#','B','#','#','#','#','#','#','#'},
{'#','#','#','#','.','.','.','.','#','#','#','#'},
{'#','#','#','#','.','#','#','#','#','.','.','#'},
{'#','.','.','.','.','#','#','#','#','#','.','#'},
{'#','.','#','#','#','#','#','.','#','#','.','#'},
{'#','.','#','#','#','#','#','.','#','#','.','#'},
{'#','.','#','#','.','.','.','.','.','.','.','#'},
{'#','.','#','#','.','#','#','#','.','#','.','#'},
{'#','.','.','.','.','#','#','#','.','#','.','#'},
{'#','#','.','#','.','#','#','#','.','#','.','A'},
{'#','#','.','#','#','#','.','.','.','#','#','#'},
{'#','#','#','#','#','#','#','#','#','#','#','#'}
};
// 显示迷宫
public static void show(){
for(int i=0;i<maze.length;i++){
for(int j=0;j<maze[i].length;j++){
System.out.print(" "+maze[i][j]);
}
System.out.println();
}
}
// 染色
public static Cell colorCell(Set<Cell> from,Set<Cell> desc){
Iterator<Cell> iter = from.iterator();
59
while(iter.hasNext()){
Cell a = iter.next();
Cell c[] = new Cell[4];
c[0] = new Cell(a.row-1,a.col,a); // 向上走
c[1] = new Cell(a.row+1,a.col,a); // 向下走
c[2] = new Cell(a.row,a.col-1,a); // 向左走
c[3] = new Cell(a.row,a.col+1,a); // 向右走
for(int i=0;i<4;i++){
if(c[i].row<0 || c[i].row>=maze.length) continue;
if(c[i].col<0 || c[i].col>=maze[0].length) continue;
char x = maze[c[i].row][c[i].col]; // 取得单元格对应字符
if(x=='B') return a;
if(x=='.'){
maze[c[i].row][c[i].col] = '?'; // 染色
desc.add(c[i]);
}
}
}
return null;
}
//
public static void resolve(){
Set<Cell> set = new HashSet<Cell>();
set.add(new Cell(9,11,null));
for(;;){
Set<Cell> set1 = new HashSet<Cell>();
// 出口 a.from.from.from.....<-(set.get(0).from)==null<-入口
Cell a = colorCell(set,set1);
if(a!=null){ // 找到解
System.out.println("找到解!");
while(a!=null){ // 当前a里包含a.from 一直往前推
maze[a.row][a.col] = '+'; // 染色路径
a = a.from;
}
break;
}
if(set1.isEmpty()){ // 遍历所以一直到没有路走,这时 set1为空
System.out.println("无解!");
break;
}
set = set1; // 向里边
}
}
public static void main(String[] args){
show();
resolve();
60
show();
}
}
运行结果:
# # # # B # # # # # # #
# # # # . . . . # # # #
# # # # . # # # # . . #
# . . . . # # # # # . #
# . # # # # # . # # . #
# . # # # # # . # # . #
# . # # . . . . . . . #
# . # # . # # # . # . #
# . . . . # # # . # . #
# # . # . # # # . # . A
# # . # # # . . . # # #
# # # # # # # # # # # #
找到解!
# # # # B # # # # # # #
# # # # + . . . # # # #
# # # # + # # # # ? ? #
# + + + + # # # # # ? #
# + # # # # # ? # # ? #
# + # # # # # ? # # ? #
# + # # + + + + + + + #
# + # # + # # # ? # + #
# + + + + # # # ? # + #
# # ? # ? # # # ? # + +
# # ? # # # ? ? ? # # #
# # # # # # # # # # # #
java实现迷宫问题的更多相关文章
- java版迷宫
当年学数据结构,正好java也刚刚学会gui编程,就想着结合起来做个小东西,然后这个自动走路的小球就出来了. 一个方向的枚举Dir.java public enum Dir { L,U,R,D } 结 ...
- Java求解迷宫问题:栈与回溯算法
摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1) 选择一个 ...
- 【译文】走出Java ClassLoader迷宫 Find a way out of the ClassLoader maze
本文是一篇译文.原文:Find a way out of the ClassLoader maze 对于类加载器,普通Java应用开发人员不需要了解太多.但对于系统开发人员,正确理解Java的类加载器 ...
- Java实现迷宫城堡(强连通图的判定)
1 问题描述 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单 ...
- java实现迷宫走法
** 迷宫走法** 迷宫问题 对于走迷宫,人们提出过很多计算机上的解法.深度优先搜索.广度优先搜索是使用最广的方法.生活中,人们更愿意使用"紧贴墙壁,靠右行走"的简单规则. 下面的 ...
- java使用链栈实现迷宫求解
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java迷宫游戏
缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...
- 小项目特供 简易迷宫(基于Java)
明天返校,于是昨天和今天简单熟系了一下JAVA的GUI,做了一个简易的迷宫小游戏(暂时没有时间实现随机迷宫及多关卡,仅供学习) 源码及运行文件(提供JRE8):链接:简易迷宫 密码:hy8v
随机推荐
- 1058 A+B in Hogwarts (20分)
1058 A+B in Hogwarts (20分) 题目: If you are a fan of Harry Potter, you would know the world of magic h ...
- angular foreach的使用
var myAppModule = angular.module('myApp', []); var values = { name : 'misko', gender : 'male', " ...
- chmod的用法
指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案 ...
- react-grid-layout实现拖拽,网格布局
借鉴地址:https://www.jianshu.com/p/b48858eee3a7 安装 react-grid-layout npm install react-grid-layout impor ...
- 浅谈PostgreSQL用户权限
问题 经常在PG群里看到有人在问“为什么我对表赋予了权限:但是还是不能访问表” 解析 若你看懂德哥这篇文章PostgreSQL逻辑结构和权限体系介绍:上面对你就不是困扰你的问题 解决这个问题很简单:在 ...
- Java开发架构篇:DDD模型领域层决策规则树服务设计
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅 ...
- git branch分支
推荐看这个教程: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758 ...
- Java创建线程的方式
Java中线程的创建有四i种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 3.应用程序 ...
- css概述三
五.盒子模型 4.box-sizing 定义盒子模型的计算方式 box-sizing:content-box; 默认值,我们定义的width/height是内容区域 元素占地宽度=左外边距+左边框+左 ...
- HTML5新特性--svg-echarts(重点)-拖动API-WebWorker
一.html5新特性--svg--(折线/渐变特效对象/滤镜) #折线:多个坐标点组件一条折线 <polyline points="50,50 70,55 60,66 " s ...