1. 程式人生 > >迷宮求解最短路徑問題java版

迷宮求解最短路徑問題java版

對於計算機,面對錯亂複雜的迷宮探路問題也不可能一步就找到最優路徑,而是把所有可行路徑全部走過然後通過比較找出最優路徑,對於每走一步都有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("");
//找出最短路徑  然後賦值給Path
if(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標記為1
if(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();
}
}