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

最新文章

  1. ASP.NET MVC SSO单点登录设计与实现
  2. git本地提交到远程仓库命令
  3. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战
  4. 微信公众号开发之LBS
  5. jsp的三种自定义标签 写法示例
  6. Java汉诺塔算法
  7. Codeforces Gym 100418J Lucky tickets 数位DP
  8. ServletContext对象(每个工程只有一个此对象)
  9. git commit
  10. .Net程序员学用Oracle系列(15):DUAL、ROWID、NULL
  11. PowerShell 官方下载地址
  12. solus下 修改 crate-react-app 的默认下载依赖方式为 yarn
  13. 206. Reverse Linked List (List)
  14. sqlserver打开对象资源管理器管理的帮助文档的快捷键
  15. ES6之Promise用法详解
  16. 华为S5300系列交换机限制特定IP可以登录Web
  17. 【树莓派】树莓派上刷android系统
  18. java cocurrent ConcurrentHashMap、读写锁、Condition、线程池、Barrier、CountDownLatch、Callable、BlockingQueue
  19. Oracle RAC的机制与测试方法
  20. MongoDb进阶实践之四 MongoDB查询命令详述

热门文章

  1. windows网卡命令
  2. OpenStack 存储服务 Cinder存储节点部署LVM (十四)
  3. vue v-bind绑定属性和样式
  4. Python:使用正则去除HTML标签(转)
  5. markdown与html之间转换引发的问题
  6. Python3 字典及三级菜单练习
  7. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)
  8. VB查询数据库之报表——机房收费系统总结(六)
  9. Java本地方法(native方法)的实现
  10. Java并发(三):重排序