題目要求如下:
有個二維數組代表迷宮如下:0代表道路,2代表牆壁。
int [][] maze={
{2,2,2,2,2,2,2},
{0,0,0,0,0,0,2},
{2,0,2,0,2,0,2},
{2,0,0,2,0,2,2},
{2,2,0,2,0,2,2},
{2,0,0,0,0,0,2},
{2,2,2,2,2,0,2},
};
假設老鼠從索引(1,0)開始,找出老鼠如何跑至索引(6,5)位置。
使用棧為存儲結構,存儲老鼠的行走路線。防止出現數組越界情況,在地圖周圍再加一圈圍牆,產生一個新的地圖。再創建一個二維數組,儲存老鼠走過的路徑,走過的路徑全部標記為1,未走過的路徑標記為0。具體程序如下,
package test;
import java.util.Scanner;
import java.util.Stack;
import javax.sound.midi.SysexMessage;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int [][] maze={
{2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2},
{2,0,0,0,0,0,0,2,2},
{2,2,0,2,0,2,0,2,2},
{2,2,0,0,2,0,2,2,2},
{2,2,2,0,2,0,2,2,2},
{2,2,0,0,0,0,0,2,2},
{2,2,2,2,2,2,0,2,2},
{2,2,2,2,2,2,2,2,2}
}; //在地圖外面加一圈圍牆,防止數組越界。
Stack stacki = new Stack(); //這里為了省事,創建兩個棧,保存位置信息。
Stack stackj = new Stack();
int [][] posi={
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0}
}; //保存老鼠走過的路徑,走過標記為1,未走過的標記為0
int i=2,j=1;
posi[i][j]=1;
stacki.push(i); //先將起點入棧。
stackj.push(j);
while(!stacki.empty()&&!stackj.empty())
{
if(i==7&&j==6)
break;
if(maze[i][j+1]==0&&posi[i][j+1]==0) //向右探索
{
posi[i][j+1]=1;
j++;
stacki.push(i);
stackj.push(j);
}
else if(maze[i+1][j]==0&&posi[i+1][j]==0) //向下探索
{
posi[i+1][j]=1;
i++;
stacki.push(i);
stackj.push(j);
}
else if(maze[i-1][j]==0&&posi[i-1][j]==0) //向上探索
{
posi[i-1][j]=1;
i--;
stacki.push(i);
stackj.push(j);
}
else if(maze[i][j-1]==0&&posi[i][j-1]==0) //向左探索
{
posi[i][j-1]=1;
j--;
stacki.push(i);
stackj.push(j);
}
else
{
stacki.pop(); //走到死路,就將棧中該位置的點 出棧。
stackj.pop();
if(stacki.empty()&&stackj.empty())
{
break;
}
i=(int) stacki.peek(); //peek()取棧頂元素。
j=(int) stackj.peek();
}
}
Stack si=new Stack();
Stack sj=new Stack();
while(!stacki.empty()&&!stackj.empty()) //棧反轉。
{
si.push(stacki.peek());
sj.push(stackj.peek());
stacki.pop();
stackj.pop();
}
while(!si.empty()) // 將反轉后的棧,挨個出棧,這就是老鼠的軌跡。
{
System.out.print((int)si.peek()-1);
System.out.print(" ");
System.out.println((int)sj.peek()-1);
si.pop();sj.pop();
}
}
}
這個程序還可以繼續改進一下,將地圖封裝成一個類,將老鼠的位置封裝成一個類。這里僅僅是為了練習,並不完整,僅供參考。