问题描述
一只小老鼠从起点通过一些障碍到达终点,四周的墙壁不能通行,请设计出迷宫路径,使老鼠成功逃出迷宫。
一、解题思想
1、先用二维数组创建一个迷宫
2、用数字表示数组每个元素的不同状态
0 没有障碍物
1 有障碍物
2 走过可以走
3 走过但走不通
3、将最上面和最下面两行以及最左边最右边两行设置为1表示墙
4、将数组中的障碍物都用1表示,输出地图
5、创建一个方法findway用来找出迷宫的路径
6、如果找到返回true,否则返回false
7、确定老鼠找路的策略,先向哪个方向
二、编写代码
1.创建迷宫
代码如下:
public class MiGong {
public static void main(String[] args) {
//创建map数组表示一个八行七列的迷宫,第四行第2、3个为障碍物
//0代表可以走,1代表障碍物
int map[][] = new int[8][7];//八行七列的数组
for (int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;//上下两行障碍物
}
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;//左右两列障碍物
}
map[3][1] = 1;
map[3][2] = 1;//第四行的两个障碍物
//输出迷宫
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j]);//输出一行
}
System.out.println();//输出一行后换行
}
}
}
会得到一个如下的数组表示迷宫
2.写出findway方法
代码如下:
class F{
//使用递归回溯思想写findway方法
//i,j表示老鼠的位置,最初位置为(1,1)
//当map[6][5]=2说明找到通路可以结束,否则继续找
//确定找路策略 下 -> 右 -> 上 -> 左
public boolean findway(int[][] map , int i , int j){
//找到返回true,没找到返回false
if(map[6][5] == 2){
//已经找到
return true;
}else{
if(map[i][j] == 0){
//当前位置为0,可以走
//假定可以走通
map[i][j] = 2;
//开始按策略找路
if(findway(map, i + 1, j)){
//先向下走
return true;
}else if(findway(map, i, j + 1)){
//向右
return true;
}else if(findway(map, i - 1, j)){
//向上
return true;
}else if(findway(map, i, j - 1)){
//向左
return true;
}else{
//假定可以走通是错误的
map[i][j] = 3;
return false;
}
}else{
//map[i][j]=1,2,3
return false;
}
}
}
}
3.整体代码测试如下
public class MiGong {
public static void main(String[] args) {
//创建map数组表示一个八行七列的迷宫,第四行第2、3个为障碍物
//0代表可以走,1代表障碍物
int map[][] = new int[8][7];//八行七列的数组
for (int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;//上下两行障碍物
}
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;//左右两列障碍物
}
map[3][1] = 1;
map[3][2] = 1;//第四行的两个障碍物
//输出迷宫
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j]);//输出一行
}
System.out.println();//输出一行后换行
}
//使用findway方法给老鼠找路
F f1 = new F();
f1.findway(map, 1, 1);
System.out.println("找路情况如下");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
class F{
//使用递归回溯思想写findway方法
//i,j表示老鼠的位置,最初位置为(1,1)
//当map[6][5]=2说明找到通路可以结束,否则继续找
//确定找路策略 下 -> 右 -> 上 -> 左
public boolean findway(int[][] map , int i , int j){
//找到返回true,没找到返回false
if(map[6][5] == 2){
//已经找到
return true;
}else{
if(map[i][j] == 0){
//当前位置为0,可以走
//假定可以走通
map[i][j] = 2;
//开始按策略找路
if(findway(map, i + 1, j)){
//先向下走
return true;
}else if(findway(map, i, j + 1)){
//向右
return true;
}else if(findway(map, i - 1, j)){
//向上
return true;
}else if(findway(map, i, j - 1)){
//向左
return true;
}else{
//假定可以走通是错误的
map[i][j] = 3;
return false;
}
}else{
//map[i][j]=1,2,3
return false;
}
}
}
}
测试结果
数字2所经过的地方就是小老鼠出迷宫的路径
三、总结
找路的策略不同,最后得到的路径就会不同