1 packagecom.zhoujianxiang;2
3 importjava.util.Stack;4
5 classNode{6
7 boolean attainability; //节点是否可达到
8 int x,y; //节点的位置信息
9 int direction = 1;10 intscore;11 String id = " ";12 //Node leftNode,rightNode,upNode,downNode;13 //Node fatherNode;
14 }15 public classPuzzle {16 Node[][] maze = null; //迷宫数组
17 Node startNode,endNode; //起始点,结束点
18
19 publicPuzzle(){20 //初始化迷宫数组~并指定起始点和结束点
21 maze = new Node[7][9];22
23 for(int i=0;i<7;i++)24 for(int j=0;j<9;j++){25 maze[i][j] = newNode();26
27 maze[i][j].attainability = true;28 maze[i][j].x =i;29 maze[i][j].y =j;30 }31 startNode = maze[3][2];32 startNode.id = "&";33 endNode = maze[3][6];34 endNode.id = "@";35 for(int i=0;i<7;i++){36 maze[i][0].attainability = false;37 maze[i][8].attainability = false;38 }39 for(int j=0;j<9;j++){40 maze[0][j].attainability = false;41 maze[6][j].attainability = false;42 }43 maze[4][3].attainability = false;44 maze[2][4].attainability = false;45 maze[3][4].attainability = false;46 maze[4][4].attainability = false;47 }48
49 private voidprintMaze(){50
51 for(int i=0;i<7;i++){52 for(int j=0;j<9;j++){53
54 if(maze[i][j].attainability)55 if(maze[i][j] ==startNode)56 System.out.print("& ");57 else if(maze[i][j] ==endNode)58 System.out.print("@ ");59 else System.out.print(maze[i][j].id + " ");60
61 else
62 if(i==0 || i==6 || j==0 ||j==8 || (i==4&&j==3) ||(i==2&&j==4) ||(i==3&&j==4) ||(i==4&&j==4))63 System.out.print("# ");64 else System.out.print(maze[i][j].id + " ");65 }66 System.out.println();67 }68 }69
70 public voidgetPath(){71 Stack s = newStack();72 Node curpos =startNode;73 //int curstep = 1;
74 do{75 if(curpos.attainability){76 curpos.attainability = false;77 if(curpos!=startNode && curpos!=endNode)78 curpos.id = "%";79 s.push(curpos);80 if(curpos ==endNode) printMaze();81 Node tmp = nextPos(curpos,1);82 curpos =maze[tmp.x][tmp.y];83 //curpos.id++;84 //curstep++;
85 }86 else{87 Node e =(Node)s.pop();88 while(e.direction == 4 && !s.empty()){89 e.attainability = false;90 e =(Node)s.pop();91 }92 if(e.direction < 4){93 e.direction++;94 s.push(e);95 Node tmp =nextPos(e,e.direction);96 curpos =maze[tmp.x][tmp.y];97 }98 }99 }while(!s.empty());100 }101
102 private Node nextPos(Node pos, inti){103 //按东南西北的顺序
104 Node tmp = newNode();105 tmp.direction =pos.direction;106 tmp.attainability =pos.attainability;107 int x =pos.x;108 int y =pos.y;109 if(i == 2 && x
110 x = x+1;111 tmp.y =pos.y;112 tmp.x =x;113 }114 else if(i == 4 && x != 0){ //北
115 x = x-1;116 tmp.y =pos.y;117 tmp.x =x;118 }119 else if(i == 1 && y
120 y = y+1;121 tmp.x =pos.x;122 tmp.y =y;123 }124 else if(i == 3 && y != 0){ //西
125 y = y - 1;126 tmp.x =pos.x;127 tmp.y =y;128 }129 returntmp;130 }131
132 public voidAstar(){133 getScore();134
135 Stack open = new Stack(); //初始开启列表
136 open.push(startNode);137
138 Stack close = new Stack(); //初始关闭列表
139 while(open.size()!=0){140 Node x =(Node)open.pop();141 if(x ==endNode)142 break;143 Node[] t = null;144 if(x.attainability){145 t =getNear(x);146
147 for(int i=0;i
175
176 private voidsort(Stack s) {177 //对一个栈里的元素按score排序,值最少的放在最上面。
178 Node[] t = newNode[s.size()];179 Node tmp = null;180 int x =s.size();181 for(int i=0;i
196 private voidgetScore(){197 for(int i=0;i
204 Node leftNode = (e.y!=0 ? maze[e.x][e.y-1] : null);205 Node rightNode = (e.y!=maze[0].length-1 ? maze[e.x][e.y+1] : null);206 Node upNode = (e.x!=0 ? maze[e.x-1][e.y] : null);207 Node downNode = (e.x!=maze.length-1 ? maze[e.x+1][e.y] : null);208 Node[] t ={leftNode,rightNode,upNode,downNode};209
210 returnt;211 }212
213 public static voidmain(String[] args){214 Puzzle p = newPuzzle();215 System.out.println("初始的迷宫如下:(其中&代表起点,@代表终点,#代表障碍)");216 p.printMaze(); //输出初始化的迷宫
217 System.out.println();218 System.out.println("简单的一条寻路路径如下:(按东南西北的顺序遍历寻路)");219 p.getPath(); //输出搜寻从起始点到结束点的路径
220
221 p = newPuzzle();222 System.out.println();223 System.out.println("用A*算法寻路路径如下:");224 p.Astar();225
226
227 }228 }