所有的代码不包括测试.
package com.mao.user;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
public class 迷路小女孩 {
private Point 位置 = new Point();
private 指南针 方向 = 指南针.东; //初方向
public Point get位置() {
return 位置;
}
public void set位置(Point 位置) {
this.位置 = 位置;
}
public 指南针 get方向() {
return 方向;
}
public void set方向(指南针 方向) {
this.方向 = 方向;
}
/**
* 核心算法
* 1.作标记
* 2.找到所有的路
* 3.如果没有路就返回真
* 4.如果初始方向不能前进就改变方向
* 5.向着指定方向走一格
* @param maze
* @return
*/
public boolean 走一步(迷宫 maze){
maze.撒面包(位置);
List<指南针> ways = findWayOut(maze);
if(ways.isEmpty()){
return true;
}else if(!ways.contains(方向)){
方向 = ways.iterator().next();
}else{
// no change
}
方向.走(位置);
return false;
}
/**
* 老鼠向四个方向跑可以得到所有可以走的路
* @param maze
* @return
*/
public List<指南针> findWayOut(迷宫 maze){
List<指南针> ways = new ArrayList<指南针>();
for(指南针 way:指南针.values()){
Point rate = new Point(位置);
way.走(rate);
if(!maze.掉下悬崖(rate)&&!maze.巨石压死(rate)){
ways.add(way);
}
}
return ways;
}
public static void main(String[] args) {
迷宫 maze = new 迷宫(3);
迷路小女孩 gril = new 迷路小女孩();
gril.set位置(new Point(0,0));
while (!gril.走一步(maze)) {
System.out.println(maze);
}
System.out.println(maze);
}
}
enum 指南针{
东(1,0),西(-1,0),南(0,1),北(0,-1);
int x,y;
private 指南针(int x, int y) {
this.x = x ;
this.y = y;
}
public Point 走(Point point){
point.translate(x, y);
return point;
}
}
package com.mao.user;
import java.awt.Point;
import java.util.HashMap;
import java.util.Map;
public class 迷宫 {
public static final int INITMAZ = -1;
Map<Point, Integer> 格子 = new HashMap<Point, Integer>();
private int 面包屑 = 1;
private int 边长 = 0 ;
/**
* 初始化迷宫
* @param 边长
*/
public 迷宫(int 边长){
this.边长 = 边长;
for(int i =0 ; i <边长*边长;i++){
格子.put(new Point(i/边长,i%边长), INITMAZ);
}
}
/**
* 打印迷宫状态
*/
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
for(int i =0 ; i <边长;i++){
for(int j = 0 ; j < 边长 ; j ++){
Integer show = 格子.get(new Point(j,i));
builder.append(show);
builder.append("\t");
}
builder.append("\n");
}
return builder.toString();
}
/**
* 标记已走过的位置
* @param 位置
*/
public void 撒面包(Point 位置) {
格子.put(位置,面包屑++);
}
/**
* 这个点不在数组之中
* @param point
* @return
*/
public boolean 掉下悬崖(Point point) {
if(point.x>=边长)return true;
if(point.x<0)return true;
if(point.y>=边长)return true;
if(point.y<0)return true;
return false;
}
/**
* 这个点已经被标记过
* @param point
* @return
*/
public boolean 巨石压死(Point point) {
if(格子.get(point)!=INITMAZ){
return true;
}
return false;
}
}