使用递归完成迷宫题
Posted 奔跑的路奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用递归完成迷宫题相关的知识,希望对你有一定的参考价值。
使用递归完成一个定义好迷宫题
========迷宫地图的原始图============
1 1 1 1 1 1 1 //行;列的索引位置是0开始
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
问题:给定迷宫的入口和出口位置,需要你找到其中经过的位置
定义map为二维数组
约定:当map[i][j]=0表示该点没有走过,
当map[i][j]=1表示墙,不能走,
当map[i][j]=2表示该位置可以走同
当map[i][j]=3表示该位置已经走过,但是走不通死路
1:生成迷宫图的代码
1:生成迷宫图的代码
//使用二维数组模拟迷宫
int[][] map = new int[8][7];
//使用1表示墙,表示不能通过
//上下的行置为1
for (int i=0;i<7;i++){
map[0][i] = 1;
map[7][i] = 1;
}
//左右的列置为1
for (int i=0;i<8;i++){
map[i][0] = 1;//第一列
map[i][6] = 1;//第7列
}
//设置其他挡的墙
map[3][1] = 1;
map[3][2] = 1;
2:解题代码
2:解题代码
注意:在走迷宫时,需要确定一个策略(方法)比如:下->右->上->左 , 如果按该方法走不同就回溯(策略是可以自己更改的)
/**
* 使用递归回溯来解迷宫找路
* 如果找到指定的位置[6][5],则说明通路找到
* 约定:当map[i][j]=0表示该点没有走过,
* 当map[i][j]=1表示墙,不能走,
* 当map[i][j]=2表示该位置可以走同
* 当map[i][j]=3表示该位置已经走过,但是走不通死路
* 在走迷宫时,需要确定一个策略(方法): 下->右->上->左 , 如果按该方法走不同就回溯
* @param map:地图
* @param i:从哪个位置开始找 (i,j)
* @param j:从哪个位置开始找 (i,j)
* @return : 成功:true 失败:false
*/
public static boolean setWay(int[][] map , int i , int j){
if (map[6][5] == 2){//说明通过找到
return true;
}else {
if (map[i][j] == 0){//如果该点没有走过,就可以按定义的策略玩了
//下->右->上->左
map[i][j] = 2;//先假定该点是可以走通的
if (setWay(map , i+1 , j)){//在上面假定的基础上开始向下走
return true;
}else if (setWay(map , i , j+1)){ //else向右走
return true;
}else if (setWay(map , i-1 , j)){ //else向上走
return true;
}else if (setWay(map , i , j-1)){ //else向左走
return true;
}else { //3表示该位置已经走过,但是走不通
//说明该点走不同,是死路
map[i][j] = 3;
return false;
}
}else { //如果map[i][j]不等于0,可能是 1;2;3
//直接返回false
return false;
}
}
}
3:完整代码的演示
3:完整代码的演示
/**
* 递归完成迷宫题
*/
public class MiGong {
public static void main(String[] args) {
//使用二维数组模拟迷宫
int[][] map = new int[8][7];
//使用1表示墙
//上下的行置为1
for (int i=0;i<7;i++){
map[0][i] = 1;
map[7][i] = 1;
}
//左右的列置为1
for (int i=0;i<8;i++){
map[i][0] = 1;//第一列
map[i][6] = 1;//第7列
}
//设置其他挡的墙
map[3][1] = 1;
map[3][2] = 1;
//直接全走不了的测试,就标识为了3,产生回溯
// map[1][2] = 1;
// map[2][2] = 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();
}
//使用递归回溯给迷宫找路
setWay(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();
}
}
public static boolean setWay(int[][] map , int i , int j){
if (map[6][5] == 2){//说明通过找到
return true;
}else {
if (map[i][j] == 0){//如果该点没有走过,就可以按定义的策略玩了
//下->右->上->左
map[i][j] = 2;//先假定该点是可以走通的
if (setWay(map , i+1 , j)){//在上面假定的基础上开始向下走
return true;
}else if (setWay(map , i , j+1)){ //else向右走
return true;
}else if (setWay(map , i-1 , j)){ //else向上走
return true;
}else if (setWay(map , i , j-1)){ //else向左走
return true;
}else { //3表示该位置已经走过,但是走不通
//说明该点走不同,是死路
map[i][j] = 3;
return false;
}
}else { //如果map[i][j]不等于0,可能是 1;2;3
//直接返回false
return false;
}
}
}
/**
* 修改找路的策略(右-》下-》左-》上)
*/
public static boolean setWay2(int[][] map , int i , int j){
if (map[6][5] == 2){//说明通过找到
return true;
}else {
if (map[i][j] == 0){//如果该点没有走过,就可以按定义的策略玩了
//右-》下-》左-》上
map[i][j] = 2;//先假定该点是可以走通的
if (setWay2(map , i , j+1)){//向右走
return true;
}else if (setWay2(map , i+1 , j)){ //else向下走
return true;
}else if (setWay2(map , i , j-1)){ //else向左走
return true;
}else if (setWay2(map , i-1 , j)){ //else向上走
return true;
}else { //3表示该位置已经走过,但是走不通
//说明该点走不同,是死路
map[i][j] = 3;
return false;
}
}else { //如果map[i][j]不等于0,可能是 1;2;3
//直接返回false
return false;
}
}
}
}
4:图示
========迷宫地图的原始图============
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
==========迷宫的通路图=============
1 1 1 1 1 1 1
1 2 0 0 0 0 1
1 2 2 2 0 0 1
1 1 1 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 2 2 1
1 1 1 1 1 1 1
==========更改策略后迷宫的通路图=============
1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 0 0 0 0 2 1
1 1 1 0 0 2 1
1 0 0 0 0 2 1
1 0 0 0 0 2 1
1 0 0 0 0 2 1
1 1 1 1 1 1 1
最后,如果有问题,希望指正,一起进步。
以上是关于使用递归完成迷宫题的主要内容,如果未能解决你的问题,请参考以下文章