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();
}
}
}
这个程序还可以继续改进一下,将地图封装成一个类,将老鼠的位置封装成一个类。这里仅仅是为了练习,并不完整,仅供参考。