从前有个迷宫__面试题

阅读更多
所有的代码不包括测试.
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 格子 = new HashMap();
	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;
	}

}


你可能感兴趣的:(面试,J#,OO,算法,Eclipse)