迷宫回溯问题 java递归实现
目录
一.首先确定规则
规定 1 是墙体 0 是可以走的路 2 是在可以走的路上的路线 3是以及探索过的但无法走通的路
规定 2 探索顺序也就是对于路径的优先探索放向 首先 先向下探索 然后再向右边 其次在向左边
最后再向上边 探索 具体顺序可以自己确定
规定 3 在探索中难免会遇到死路 在遇到死路时 回溯方向与探索顺序应该相互对应 避免出现路径错乱的问题
规定 4 在对于死路时 应该进行标记 标记为3
二.迷宫数组地图
地图
1 1 1 1 1 1 1 1 1 1
1 起 0 0 0 0 0 0 0 1
1 1 0 0 0 1 1 1 0 1
1 0 1 0 0 0 0 1 0 1
1 0 0 1 1 1 1 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 1 0 1 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 1 0 终 1
1 1 1 1 1 1 1 1 1 1
三.代码实现
(一)计数器------作用是判断该点是否可以使用
一下代码是个实现了一个判断器 判断该点是否是可以用的点 所谓的可以用点 就是在该点的上下左右的四个方向中一定要存在一个点也就是二维数组上该点的值应该是0 表示从未走过 可以作为路径的点 如果存在可以走的点 则要返回值是真 否则返回值为假
private static boolean isAble(int [][]map,int i,int j)
{
//这个地方不是去判断是否可走 而是在判断是否走的通的问题
//如果所有点都不可取
//先判断下面是否可走
// 使用计数器 able;
int able=0;
//判断下边
int value=map[i+1][j];
if (value==1||value==2||value==3)
able++;
//判断右边
value=map[i][j+1];
if (value==1||value==3||value==2)
able++;
//判断左边
value=map[i][j-1];
if (value==1||value==3||value==2)
able++;
//判断上边是否可走
value=map[i-1][j];
if (value==1||value==3||value==2)
able++;
if (able==4)
return false;
else
return true;
}
(二) 递归方法 ----配合计数器使用
首先 原本 数组的值只有 1 和 0 如果确定该点暂时可以走 将会赋值为2 具体下面的代码 调用计数器判断可以走的时候 就会暂时变为2 如果需要回溯的时候该点的值就会从2也就是 该点不可以走通了的情况 就会变为3
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 1 0 0 0 1 1 1 0 1
1 0 1 0 0 0 0 1 0 1
1 0 0 1 1 1 1 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 1 0 1 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 1 0 0 1
1 1 1 1 1 1 1 1 1 1
代码实现的时候先判断该点是否需要回溯 如果需要回溯就利用规则3 找到上一步的位置 同时该店的值变为3
如果不需要 则利用规则2 进行向下探索同时该点的值变为2
private static boolean Labyrinth_backtracking(int [][]map,int i,int j)
{
//首先判断区域到达条件
if (i==map.length-2&&j==map[0].length-2)
{
//这里已经表明该点是已经是终点了
//设置该点的值
map[i][j]=2;
return true;
}
//否则表示没到达 然后判断条件
else {
//判断该点是否可以用 //如果不可以使用则开始进行回溯
boolean able = isAble(map, i, j);
//如果 able值为真则可以继续使用 如果是否则说明 该点前后左右方向上的点要么是墙
//要么是走过的点 或则是无法走通的点 那么就说明需要回溯了
if(!able)
{
//表明该点不可以使用
map[i][j]=3;
//准备开始回溯 //回溯采用规则3 确定回溯点
if (map[i-1][j]==2)
return Labyrinth_backtracking(map,i-1,j);
else if (map[i][j-1]==2)
return Labyrinth_backtracking(map,i,j-1);
else if (map[i][j+1]==2)
return Labyrinth_backtracking(map,i,j+1);
else
return Labyrinth_backtracking(map,i+1,j);
}
else{
//将该点置值进行更改定位
map[i][j]=2;
//表示可以使用继续探索 向下探索
if (map[i+1][j]!=1&&map[i+1][j]!=3&&map[i+1][j]!=2)
//如果该店可以用就直接跳转如果不能用就
return Labyrinth_backtracking(map, i+1, j);
//向右边探索
else if (map[i][j+1]!=1&&map[i][j+1]!=3&&map[i][j+1]!=2)
return Labyrinth_backtracking(map, i, j+1);
//向左边探索
else if (map[i][j-1]!=1&&map[i][j-1]!=3&&map[i][j-1]!=2)
return Labyrinth_backtracking(map, i, j-1);
//进行向上面探索
else if (map[i-1][j]!=1&&map[i-1][j]!=3&&map[i-1][j]!=2)
return Labyrinth_backtracking(map, i-1, j);
else
return false;
}
}
}
最后得出的结果 对二维数组遍历
变为
1 1 1 1 1 1 1 1 1 1
1 2 2 0 2 2 2 2 2 1
1 1 2 2 2 1 1 1 2 1
1 0 1 2 2 3 3 1 2 1
1 0 0 1 1 1 1 1 2 1
1 0 0 0 0 1 0 0 2 1
1 0 0 0 1 0 1 0 2 1
1 0 0 0 0 0 0 1 2 1
1 0 0 0 0 0 1 0 2 1
1 1 1 1 1 1 1 1 1 1
如有不足或者错误欢迎评论指正