java實現簡單二維迷宮


題目要求如下:

有個二維數組代表迷宮如下: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();
        }
 }
}

 

這個程序還可以繼續改進一下,將地圖封裝成一個類,將老鼠的位置封裝成一個類。這里僅僅是為了練習,並不完整,僅供參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM