java做a_A*算法(java实现)

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值