迷宫算法
2018年03月29日
⁄ 综合
⁄ 共 2657字 ⁄ 字号
小 中 大
- import java.util.Stack;
- public class FindPath {
- private static final int wid = 8;
- private static final int hei = 8;
- private Stack stack = new Stack();
-
-
- public static void main(String[] args) {
-
- byte[] map = {1,1,1,1,1,1,1,1,
- 1,1,1,1,0,1,1,1,
- 1,0,0,1,0,0,1,1,
- 1,0,0,0,0,0,1,1,
- 1,1,0,0,1,1,1,1,
- 1,1,1,0,1,1,1,1,
- 1,1,0,0,1,1,1,1,
- 1,1,1,1,1,1,1,1};
- for (int i = 0; i < map.length; i++) {
- System.out.print(map[i] + " ");
- if (i % wid == wid - 1) {
- System.out.print("/n");
- }
- }
- System.out.print("/n");
- FindPath ai = new FindPath();
- ai.find(map, 12, 50);
- }
- public void find(byte[] map, int origin, int target) {
- int[] step = new int[2];
- step[1] = origin;
- stack.addElement(step);
- if(findPath(map,origin,target)){
- System.out.println("succ");
- for (int i = 0; i < stack.size(); i++) {
- int[] temp = (int[])stack.elementAt(i);
- System.out.println(i+" /t"+(char)temp[0]+" "+temp[1]);
- }
- }else{
- System.out.println("fail");
- }
- }
-
-
- public boolean findPath(byte[] map, int origin, int target) {
- if (canMoveTo(map, origin, target, 'l')) {
- return true;
- }
- if (canMoveTo(map, origin, target, 'r')) {
- return true;
- }
- if (canMoveTo(map, origin, target, 'u')) {
- return true;
- }
- if (canMoveTo(map, origin, target, 'd')) {
- return true;
- }
- stack.pop();
- return false;
- }
-
-
- private boolean canMoveTo(byte[] map, int origin, int target, char direct) {
- int next = 0;
- switch (direct) {
- case 'l':
- next = origin - 1;
- break;
- case 'r':
- next = origin + 1;
- break;
- case 'u':
- next = origin - wid;
- break;
- case 'd':
- next = origin + wid;
- break;
- }
- if (map[next] == 0) {
- if (next == target) {
- int[] step = new int[2];
- step[0] = direct;
- step[1] = next;
- stack.addElement(step);
- return true;
- }
- if (!inStack(next)) {
- int[] step = new int[2];
- step[0] = direct;
- step[1] = next;
- stack.addElement(step);
- if (findPath(map, next, target)) {
- return true;
- }
- }
- }
- return false;
- }
-
-
- private boolean inStack(int posi) {
- int[] temp;
- for (int i = stack.size() - 1; i >= 0; i--) {
- temp = (int[]) stack.elementAt(i);
- if (posi == temp[1]) {
- return true;
- }
- }
- return false;
- }
- }