對于計算機,面對錯亂復雜的迷宮探路問題也不可能一步就找到最優路徑,而是把所有可行路徑全部走過然后通過比較找出最優路徑,對于每走一步都有4個可行方向可走,然后通過循環借助計算機的高效率找出最優路徑。代碼如下:
public class Maze {//出口目標點坐標PRivate static final int X = 8;private static final int Y = 8;private static final int MaxSize = 200;//迷宮路徑int[][] maze = {{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1},};Node Stack[] = new Node[MaxSize];Node Path[] = new Node[MaxSize];//棧頂指針int top = -1;//路徑的計數int count = 1;//記錄最短路徑int minlen = MaxSize;public Maze() {System.out.println("路徑如下:");mazePath(1,1,X,Y);}//尋路方法public void mazePath(int xi,int yi,int xe,int ye){int i,j,di,find;//初始化棧 起始地點入棧top++;Node n = new Node();Stack[top] = n;System.out.println(Stack[top]);Stack[top].i = xi;Stack[top].j = yi;Stack[top].di = -1;maze[xi][yi] = -1;//如果棧不為空就繼續探路while(top>-1){//取出棧頂元素i = Stack[top].i;j = Stack[top].j;di = Stack[top].di;//判斷是否已經找到目標點出口 如果找到出口那么打印路徑if(i==xe && j ==ye){System.out.println(" "+(count++));for(int k = 0;k <= top;k++){System.out.printf("(%d , %d)",Stack[k].i,Stack[k].j);//每行打印5個坐標點然后換行if((k+1)%5==0){System.out.println("");}}System.out.println("");//找出最短路徑 然后賦值給Pathif(top+1 < minlen){minlen = top+1;System.out.println(minlen+"");for(int k = 0;k <= top;k++){Node node = new Node();Path[k] = node;Path[k].i = Stack[k].i;Path[k].j = Stack[k].j;Path[k].di = Stack[k].di;}}//退出一步繼續查找可行路徑maze[Stack[top].i][Stack[top].j] = 0;top--;i = Stack[top].i;j = Stack[top].j;di = Stack[top].di;}//根據四個方向試探性的查找可行路徑find = 0;//用來標記是否已經找到可行路徑 0 沒找到 1找到while(find==0 && di<4){di++;switch(di){ case 0: i = Stack[top].i-1;j = Stack[top].j;break; case 1: i = Stack[top].i;j = Stack[top].j+1;break; case 2: i = Stack[top].i+1;j = Stack[top].j;break; case 3: i = Stack[top].i;j = Stack[top].j-1;break; }//如果找到可行路徑那么find標記為1if(maze[i][j] == 0){find = 1;}}if(find == 1){//如果找到出口那么進棧Stack[top].di = di; //進棧前記錄當前立腳點的尋路方向top++;Node n1 = new Node();Stack[top] = n1;Stack[top].i = i;Stack[top].j = j;Stack[top].di = -1;//已走過路徑標記為-1防止重復路過maze[i][j] = -1;}else{//否則退一步,然后繼續試探可行路徑maze[Stack[top].i][Stack[top].j] = 0; //釋放路徑 為了以后的試探讓路top--;}}//一切執行結束后打印最短路徑System.out.println("最短路徑如下:");System.out.println("最短路徑長度:"+minlen);System.out.println("路徑:");//打印最短路徑for(int k = 0;k < minlen;k++){System.out.printf("(%d , %d)",Path[k].i,Path[k].j);if((k+1)%5 == 0){System.out.println("");}}System.out.println("");}class Node{int i;int j;int di;}public static void main(String[] args) {new Maze();}}
新聞熱點
疑難解答