資料結構經典演算法學習之老鼠走迷宮02
阿新 • • 發佈:2018-12-31
老鼠走迷宮
基於上一遍博文的基礎上,稍作修改,顯示所有可達到的最近路線(這裡指的最近就是不存在到達出口處還在別的出口來回走,額。。。可能沒表達清楚,讀者可以自己跑一下程式看看就明白了)
程式碼實現:
package wj.arithmatic;
public class Mourse {
int maze[][] = { { 2, 2, 2, 2, 2, 2, 2 }, { 2, 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, 2, 2 } };
public void mourse() {
// 迷宮圖初始化
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
if (maze[i][j] == 2) {
System.out.print("+");
} else {
System.out.print(" ");
}
}
System.out.println();
}
// 老鼠起點設定,遊戲開始
find(0, 1);
}
// 是否越界
public boolean isIndexOut(int i, int j) {
return i < 0 || j > 6;
}
// 迷宮路徑尋找
public void find(int i, int j) {
// 找到任意出口,結束
if (i == 5 && maze[i][j] == 1) {
System.out.println("老鼠找到了一條迷宮的出路!");
}
// 左
if (!isIndexOut(i, j - 1)) {
if (maze[i][j - 1] == 0) {
System.out.println("第" + times + "步從座標(" + i + "),(" + j + ")走到座標(" + i + "),(" + (j - 1) + ")");
times++;
// 走過的路線填充為1,避免重複
maze[i][j + 1] = 1;
find(i, j + 1);
}
}
if (!isIndexOut(i, j + 1)) {
// 右
if (maze[i][j + 1] == 0) {
System.out.println("第" + times + "步從座標(" + i + "),(" + j + ")走到座標(" + i + "),(" + (j + 1) + ")");
times++;
// 走過的路線填充為1,避免重複
maze[i][j+1] = 1;
find(i, j + 1);
}
}
if (!isIndexOut(i-1, j)) {
//上
if (maze[i - 1][j] == 0) {
System.out.println("第" + times + "步從座標(" + i + "),(" + j + ")走到座標(" + (i - 1) + "),(" + j + ")");
times++;
// 走過的路線填充為1,避免重複
maze[i - 1][j] = 1;
find(i - 1, j);
}
}
if (!isIndexOut(i+ 1, j)) {
//下
if (maze[i + 1][j] == 0) {
System.out.println("第" + times + "步從座標(" + i + "),(" + j + ")走到座標(" + (i + 1) + "),(" + j + ")");
times++;
// 走過的路線填充為1,避免重複
maze[i + 1][j] = 1;
find(i + 1, j);
}
}
}
public static void main(String args[]) {
new Mourse().mourse();
}
}
基於上一遍博文的基礎上,稍作修改,顯示所有可達到的最近路線(這裡指的最近就是不存在到達出口處還在別的出口來回走,額。。。可能沒表達清楚,讀者可以自己跑一下程式看看就明白了)
程式碼實現:
package wj.arithmatic;
public class Mourse {
int maze[][] = { { 2, 2, 2, 2, 2, 2, 2 }, { 2, 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, 2, 2 } };
public void mourse() {
// 迷宮圖初始化
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
if (maze[i][j] == 2) {
System.out.print("+");
} else {
System.out.print(" ");
}
}
System.out.println();
}
// 老鼠起點設定,遊戲開始
find(0, 1);
}
// 是否越界
public boolean isIndexOut(int i, int j) {
return i < 0 || j > 6;
}
// 迷宮路徑尋找
public void find(int i, int j) {
// 找到任意出口,結束
if (i == 5 && maze[i][j] == 1) {
System.out.println("老鼠找到了一條迷宮的出路!");
}
// 左
if (!isIndexOut(i, j - 1)) {
if (maze[i][j - 1] == 0) {
System.out.println("第" + times + "步從座標(" + i + "),(" + j + ")走到座標(" + i + "),(" + (j - 1) + ")");
times++;
// 走過的路線填充為1,避免重複
maze[i][j + 1] = 1;
find(i, j + 1);
}
}
if (!isIndexOut(i, j + 1)) {
// 右
if (maze[i][j + 1] == 0) {
System.out.println("第" + times + "步從座標(" + i + "),(" + j + ")走到座標(" + i + "),(" + (j + 1) + ")");
times++;
// 走過的路線填充為1,避免重複
maze[i][j+1] = 1;
find(i, j + 1);
}
}
if (!isIndexOut(i-1, j)) {
//上
if (maze[i - 1][j] == 0) {
System.out.println("第" + times + "步從座標(" + i + "),(" + j + ")走到座標(" + (i - 1) + "),(" + j + ")");
times++;
// 走過的路線填充為1,避免重複
maze[i - 1][j] = 1;
find(i - 1, j);
}
}
if (!isIndexOut(i+ 1, j)) {
//下
if (maze[i + 1][j] == 0) {
System.out.println("第" + times + "步從座標(" + i + "),(" + j + ")走到座標(" + (i + 1) + "),(" + j + ")");
times++;
// 走過的路線填充為1,避免重複
maze[i + 1][j] = 1;
find(i + 1, j);
}
}
}
public static void main(String args[]) {
new Mourse().mourse();
}
}