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();
        }
 }
}

 

这个程序还可以继续改进一下,将地图封装成一个类,将老鼠的位置封装成一个类。这里仅仅是为了练习,并不完整,仅供参考。

posted @ 2017-07-04 00:26  ll7  阅读(3360)  评论(0编辑  收藏  举报