package 递归recursion;
/**
* @author 郑道炫
* @version 1.0
*/
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 j = 0; j < 8; j++) {
map[j][0]=1;
map[j][6]=1;
}//设置挡板,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();
}
setway1(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();
}
}//使用递归回硕来给小球找路
//说明
//1.map 表示地图
//2.i,j表示从地图的哪个位置开始出发
//如果小球能到map[6][5]位置,则说明通路找到
//约定:当map[i][j]为0时,表示该点没有走过 当为1表示墙,如果为2表示通路可以走 ;3.表示该点已经走过,但是走不通
//在走迷宫时,我们需要确定一个策略(方法)先走下面->走右面->走上边->左
//如果走不通再回硕
/**
*
* @param map 表示地图
* @param i 从哪个位置开始找
* @param j
* @return 如果找到通路,就返回true,否则返回false
*/
public static boolean setway1(int map[][],int i,int j){
//2表示到达终点,0表示可以走,3表示走过
if (map[6][5]==2){
return true;
}else {
if (map[i][j]==0){
map[i][j]=2;
if (setway1(map, i+1, j+1)){
//右下走
return true;
}else if (setway1(map, i-1, j-1)){
//左上走
return true;
}else if (setway1(map, i+1, j-1)){
//左下走
return true;
}else if (setway1(map, i-1, j+1)){
//右上走
return true;
}else {
map[i][j]=3;
}
}else {
return false;
}
}
return false;
}
结果输出:map[6][5]我终点
前
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 3 0 3 0 3 1
1 0 3 0 3 0 1
1 1 1 3 0 3 1
1 0 3 0 3 0 1
1 3 0 3 0 3 1
1 0 3 0 3 0 1
1 1 1 1 1 1 1
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)){
//向右
return true;
}else if (setway(map, i-1, j)){
//向上
return true;
}else if (setway(map, i, j-1)){
//向左
return true;
}else {
//死路
map[i][j]=3;
//走不通!!!!
return false;
}
}else {
//走不通!!!!
return false;
}
}
}
}
结果输出:map[6][5]我终点
前
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
感想:像八皇后,骑士游走,这类题的关键在于 假设map[i][j]=终点,再利用其i和j 来定位下一步位移位置,也就是递归(Recursion)。