Java小案例-(逃离迷宫)
Java小案例-(逃离迷宫)
一,迷宫需求描述:
1,用户输入迷宫图(限制方形):字母1位墙,0为通,e为出口,m为入口,*为已访问的位置,用外围1围住迷宫
2,运行轨迹右,左,下,上
3,判断该迷宫是否能从入口走到出口,并将搜索过程输出
二,迷宫实现:
1,迷宫元素类MazeCell:
package smalldemo.maze;
class MazeCell {
public int x,y;
public MazeCell(){
}
public MazeCell(int x,int y){
this.x=x;
this.y=y;
}
public boolean equals(MazeCell cell){
return x==cell.x && y==cell.y;
}
}
2,迷宫搜索类MazeUtils:
package smalldemo.maze; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.Stack;
class MazeUtils {
private int rows,columns;
private MazeCell currentCell,exitCell=new MazeCell(),entryCell=new MazeCell();
private final char wall='1',passage='0',visited='*',entryMarker='m',exitMarker='e';
private char[][] stores;
private Stack<MazeCell> mazePath=new Stack<MazeCell>();
MazeUtils(){
int row=0,column=0; InputStreamReader in=new InputStreamReader(System.in);
BufferedReader buf=new BufferedReader(in);
Stack<String> mazeRows=new Stack<String>();
System.out.println("Enter a rectangular maze using the following"+
"characters\nm -entry\ne -exit\n1 - wall \n0 - passage\n"+"Enter one line at one time:" +
"end with Ctrl- D:");
try {
String str=buf.readLine();
while(str !=null) {
row += 1;
columns = str.length();
str = "1" + str + "1";
mazeRows.push(str);
if (str.indexOf(entryMarker) != -1) {
entryCell.x = row;
entryCell.y = str.indexOf(entryMarker);
}
if (str.indexOf(exitMarker) != -1) {
exitCell.x = row;
exitCell.y = str.indexOf(exitMarker);
}
str = buf.readLine(); }
} catch (IOException e) {
e.printStackTrace();
}
rows=row;
stores=new char[rows+2][];
stores[0]=new char[columns+2];
for(;!mazeRows.empty();row --){
stores[row]=mazeRows.pop().toCharArray();
}
stores[rows+1]=new char[columns+2];
for(int i=0;i<columns+2;i+=1){
stores[0][i]=wall;
stores[rows+1][i]=wall;
}
}
private void display(PrintStream out){
for(int row =0;row <rows +1;row+=1){
out.println(stores[row]);
}
out.println();
}
private void pushUnvisited(int row,int col){
if(stores[row][col] ==passage || stores[row][col] == exitMarker){
mazePath.push(new MazeCell(row,col));
}
}
public void exitMaze(PrintStream out){
currentCell=entryCell;
out.println();
while (!currentCell.equals(exitCell)){
int x=currentCell.x;
int y=currentCell.y;
display(System.out);
stores[x][y]=visited;
pushUnvisited(x-1,y);
pushUnvisited(x+1,y);
pushUnvisited(x,y-1);
pushUnvisited(x,y+1);
if(mazePath.isEmpty()){
display(out);
out.println("Failure");
return;
}
else{
currentCell=mazePath.pop();
}
}
display(out);
out.println("Success!");
}
public static void main(String[] args){
new MazeUtils().exitMaze(System.out);
}
}
3,结果是:
Enter a rectangular maze using the followingcharacters
m -entry
e -exit
1 - wall
0 - passage
Enter one line at one time:end with Ctrl- D:
1101
000e
00m1
^D 111111
111011
1000e1
100m11 111111
111011
1000e1
100*11 111111
111011
1000e1
10**11 111111
111011
1000e1
1***11 111111
111011
1*00e1
1***11 111111
111011
1**0e1
1***11 111111
111011
1***e1
1***11 Success! Process finished with exit code 0
Java小案例-(逃离迷宫)的更多相关文章
- Java小案例(行星移动)
Java小案例 行星移动:参考:三百集 使用软件:idea2017,java 1,图片集:这里 (idea图片源放在target目录下,才能访问到),建议从小往上看... 2,定义MyFrame p ...
- 深度优先搜索(DFS),逃离迷宫
[原创] 今天来说说深度优先搜索,深度优先是图论中的内容,大意是从某一点出发,沿着一个方向搜索下去,并伴随着有回退的特点,通常用来判断某一解是否存在,不用来寻找最优解:这里来看一个非常有意思的题目: ...
- hdu 4524 郑厂长系列故事——逃离迷宫 小水题
郑厂长系列故事——逃离迷宫 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- 《java入门第一季》之类小案例(模拟用户登录)
首先是做一个用户登录的小案例.在此基础上加入其它逻辑. import java.util.Scanner; /* * 模拟登录,给三次机会,并提示还有几次.如果登录成功,就可以玩猜数字小游戏了. * ...
- Session与Cookie的原理以及使用小案例>从零开始学JAVA系列
目录 Session与Cookie的原理以及使用小案例 Cookie和Session所解决的问题 Session与Cookie的原理 Cookie的原理 Cookie的失效时机 小提示 Session ...
- 《java入门第一季》之Character类小案例
/* * Character 类在对象中包装一个基本类型 char 的值 * 此外,该类提供了几种方法,以确定字符的类别小写字母,数字,等等,并将字符从大写转换成小写,反之亦然 * */ 下面通 ...
- hdu 1728:逃离迷宫(DFS,剪枝)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 02SpringMvc_springmvc快速入门小案例(XML版本)
这篇文章中,我们要写一个入门案例,去整体了解整个SpringMVC. 先给出整个项目的结构图:
- Java小例子(学习整理)-----学生管理系统-控制台版
1.功能介绍: 首先,这个小案例没有使用数据库,用集合的形式暂时保存数据,做测试! 功能: 增加学生信息 删除学生信息 修改学生信息 查询学生信息: 按照学号(精确查询) 按照姓名(模糊查询) 打 ...
随机推荐
- SEO优化:WordPress站点地图(html和xml)插件Baidu Sitemap Generator
前阵子分享了<如何实现纯代码制作网站地图的html和xml版本>,不过不是每个人都喜欢用纯代码来折腾博客的.今天,boke112就给大家分享一款国人柳城制作的包含html和xml两个版本的 ...
- Ubuntu上开启Apache Rewrite功能的方法
Ubuntu上开启Apache Rewrite功能的方法 本文介绍ubuntn系统中开启apache的urlrewrite功能的方法. 在Windows上开启Apache的urlRewrite非常简单 ...
- [解决] python WindowsError: [Error 3]
python 运行出错 WindowsError: [Error ] : 'D:\\\xe7\x81\xab\xe8\xbd\xa6\xe9\x87\x87\xe9\x9b\x86\xe5\x99\x ...
- HDU 6462.人类史上最大最好的希望事件-递推 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
人类史上最大最好的希望事件 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- AtCoder Regular Contest 103 Problem D Robot Arms (构造)
题目链接 Problem D 给定$n$个坐标,然后让你构造一个长度为$m$的序列, 然后给每个坐标规定一个长度为$m$的序列,ULRD中的一个,意思是走的方向, 每次从原点出发按照这个序列方向,每 ...
- 【状压dp】送餐员
[odevs2800]送餐员 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号 ...
- 【循环节】【矩阵乘法】MIPT-2016 Pre-Finals Workshop, Taiwan NTU Contest, Sunday, March 27, 2016 Problem F. Fibonacci of Fibonacci
题意:F(n)为斐波那契数列的第n项,问你F(F(n)) mod 20160519的值. 发现有循环节,F(26880696)=0,F(26880697)=1,.... 于是两次矩乘快速幂即可. #i ...
- python基础之数据类型之元组和字典
四.元组 1.用途:元组是不可变的列表,能存多个值,但只能取,不能改 2.定义:name = (‘alex’, ’egon’, ‘wxx’) 在()内用,分割开,可存放任意类型的值 强调:x = (‘ ...
- [NOI2017]整数
[NOI2017]整数 题目大意: \(n(n\le10^6)\)次操作维护一个长度为\(30n\)的二进制整数\(x\),支持以下两种操作: 将这个整数加上\(a\cdot2^b(|a|\le10^ ...
- 内网中让其他人访问我电脑上的asp.net应用程序
打开防火墙,高级配置,新建入站规则,选择“端口”,下一步,填写特定本地端口,然后都是点击下一步,命名规则,到此,内网中的其他人可以访问你的程序了