现在的位置: 首页 > 综合 > 正文

迷宫算法

2018年03月29日 ⁄ 综合 ⁄ 共 2657字 ⁄ 字号 评论关闭
  1. import java.util.Stack; 
  2. public class FindPath { 
  3.  private static final int wid = 8; 
  4.  private static final int hei = 8; 
  5.  private Stack stack = new Stack(); 
  6.  /** 
  7.   * @param args 
  8.   */ 
  9.  public static void main(String[] args) { 
  10.   // TODO Auto-generated method stub 
  11.   byte[] map = {1,1,1,1,1,1,1,1, 
  12.     1,1,1,1,0,1,1,1, 
  13.     1,0,0,1,0,0,1,1, 
  14.     1,0,0,0,0,0,1,1, 
  15.     1,1,0,0,1,1,1,1, 
  16.     1,1,1,0,1,1,1,1, 
  17.     1,1,0,0,1,1,1,1, 
  18.     1,1,1,1,1,1,1,1}; 
  19.   for (int i = 0; i < map.length; i++) { 
  20.    System.out.print(map[i] + " "); 
  21.    if (i % wid == wid - 1) { 
  22.     System.out.print("/n"); 
  23.    } 
  24.   } 
  25.   System.out.print("/n"); 
  26.   FindPath ai = new FindPath(); 
  27.   ai.find(map, 12, 50); 
  28.  } 
  29.  public void find(byte[] map, int origin, int target) { 
  30.   int[] step = new int[2]; 
  31.   step[1] = origin; 
  32.   stack.addElement(step); 
  33.   if(findPath(map,origin,target)){ 
  34.    System.out.println("succ"); 
  35.    for (int i = 0; i < stack.size(); i++) { 
  36.     int[] temp = (int[])stack.elementAt(i); 
  37.     System.out.println(i+" /t"+(char)temp[0]+" "+temp[1]); 
  38.    } 
  39.   }else
  40.    System.out.println("fail"); 
  41.   } 
  42.  } 
  43.  /** 
  44.   * 在地图上找到从原点到目标位置的路径 
  45.   *  
  46.   * @param map 
  47.   * @param origin 
  48.   * @param target 
  49.   * @return 
  50.   */ 
  51.  public boolean findPath(byte[] map, int origin, int target) { 
  52.   if (canMoveTo(map, origin, target, 'l')) { 
  53.    return true; 
  54.   } 
  55.   if (canMoveTo(map, origin, target, 'r')) { 
  56.    return true; 
  57.   } 
  58.   if (canMoveTo(map, origin, target, 'u')) { 
  59.    return true; 
  60.   } 
  61.   if (canMoveTo(map, origin, target, 'd')) { 
  62.    return true; 
  63.   } 
  64.   stack.pop();// 如果四个方向都试过,全部不行,那么把当前步骤弹出 
  65.   return false; 
  66.  } 
  67.  /** 
  68.   * 是否可以向指定方向移动 
  69.   *  
  70.   * @param map 
  71.   * @param origin 
  72.   * @param target 
  73.   * @param direct 
  74.   * @return 
  75.   */ 
  76.  private boolean canMoveTo(byte[] map, int origin, int target, char direct) { 
  77.   int next = 0; 
  78.   switch (direct) { 
  79.   case 'l'
  80.    next = origin - 1; 
  81.    break
  82.   case 'r'
  83.    next = origin + 1; 
  84.    break
  85.   case 'u'
  86.    next = origin - wid; 
  87.    break
  88.   case 'd'
  89.    next = origin + wid; 
  90.    break
  91.   } 
  92.   if (map[next] == 0) {//如果目标位置可以进入 
  93.    if (next == target) { 
  94.     int[] step = new int[2]; 
  95.     step[0] = direct;// 移动方向 
  96.     step[1] = next;// 到达的新位置 
  97.     stack.addElement(step);     
  98.     return true; 
  99.    } 
  100.    if (!inStack(next)) { 
  101.     int[] step = new int[2]; 
  102.     step[0] = direct; 
  103.     step[1] = next; 
  104.     stack.addElement(step); 
  105.     if (findPath(map, next, target)) { 
  106.      return true; 
  107.     } 
  108.    } 
  109.   } 
  110.   return false; 
  111.  } 
  112.  /** 
  113.   * 检查这个位置是否在栈中已经存在了。为了防止在地图中转圈 
  114.   *  
  115.   * @param posi 
  116.   * @return 
  117.   */ 
  118.  private boolean inStack(int posi) { 
  119.   int[] temp; 
  120.   for (int i = stack.size() - 1; i >= 0; i--) { 
  121.    temp = (int[]) stack.elementAt(i); 
  122.    if (posi == temp[1]) { 
  123.     return true; 
  124.    } 
  125.   } 
  126.   return false; 
  127.  } 

抱歉!评论已关闭.