老鼠出迷宫
现有一个图形如下:
要求老鼠在左边第一个位置,走到绿色标的出口橙色为边界不能走。
表盘可以看做是一个[8][7]大小的二维数组,可以用1表示边界,0表示可以走
int [][] arrMap = new int[8][7];
得到一个数组:
由于地图是有边界的也就是:
arrMap[0][0-6]和arrMap[7][0-6]上下要变成1
arrMap[0-7][0]和arrMap[0-7][6]左右也要要变成1
另外还有特殊的arr[3][1-2]也要变成1
int [][] arrMap = new int[8][7];for(int i = 0; i<arrMap.length;i++){for (int j = 0;j<arrMap[i].length ;j++ ) {arrMap[0][j] = 1;//最上arrMap[7][j] = 1;//最下arrMap[i][0] = 1;//最左arrMap[i][6] = 1;//最右arrMap[3][1] = 1;//特殊的arrMap[3][2] = 1;//特殊的System.out.print(arrMap[i][j]+" ");}System.out.println();}
得到
地图就制作好了,那么想要老鼠走到出口,也就是从数组[1][1]的位置走到[6][5]的位置
所以在走之前需要制定一下规则:
数字 1 代表不能走
数字 0 代表可以走,但是还没走
数字 2 代表走过的路
数字 3 代表走过,但是是死胡同(即上下左右都是1)
根据以上规则,可以得出一下结论
初始位置在【1】【1】
出口位置在【6】【5】
那么我们需要将走过的路变成数字 2 ,并且判断【6】【5】等于2的时候代表已经走出来了,返回true
如果不是等于2,那么就判断脚下的位置(下一步)是不是0,如果可以走那么就把他变成2,也就是走过的路
public boolean outMaze(int [][]map,int i,int j){if (map[i][j] == 2) {return true;}else{if (map[i][j] == 0) {map[i][j] = 2;}}}
怎么成功已经写出来了,还需要写出怎么走(难度重点)
首先我们安排,每次走的时候,是按照 下-右-上-左的顺序。
上面有判断如果是可以走的就变成2,那么如果不可以走的话,我们就按照计划的步骤,尝试计划的下(-右-上-左)是不是0可以不可以走,如果可以那么就把下一步的位置变成2,如果不可以就继续下一个右(-上-左)可以可以走,当上下左右都不是0时就把他变成数字 3 并且返回flase走到死胡同失败了。
当下-右-上-左只要有一个可以走,就接着下一个也按照下-右-上-左的顺序接着走,使用递归直至走到出口,或者走到死胡同。
if (map[i][j] == 2) {return true;}else{if (map[i][j] == 0) {map[i][j] = 2;if (outMaze(map,i+1,j)) {//看看下边能不能走return true;}else if(outMaze(map,i,j+1)){//看看右边能不能走return true;}else if(outMaze(map,i-1,j)){//看看上边能不能走return true;}else if(outMaze(map,i,j-1)){//看看左边能不能走return true;}else{//当上下左右都走不通,就是走到死胡同了,游戏失败map[i][j] = 3;return false;}}else{return false;}}
至此老鼠出迷宫的方法写完,传入实参数组看看走出的效果:
完整代码
public class Migong{public static void main(String[] args) {int [][] arrMap = new int[8][7];for(int i = 0; i<arrMap.length;i++){for (int j = 0;j<arrMap[i].length ;j++ ) {arrMap[0][j] = 1;//最上arrMap[7][j] = 1;//最下arrMap[i][0] = 1;//最左arrMap[i][6] = 1;//最右arrMap[3][1] = 1;//特殊的arrMap[3][2] = 1;//特殊的}}T t = new T();t.outMaze(arrMap,1,1);for(int y = 0; y<arrMap.length;y++){for (int u = 0;u<arrMap[y].length ;u++ ) {System.out.print(arrMap[y][u]+" ");}System.out.println();}}
}
class T {public boolean outMaze(int [][]map,int i,int j){if (map[i][j] == 2) {return true;}else{if (map[i][j] == 0) {map[i][j] = 2;if (outMaze(map,i+1,j)) {//看看下边能不能走return true;}else if(outMaze(map,i,j+1)){//看看右边能不能走return true;}else if(outMaze(map,i-1,j)){//看看上边能不能走return true;}else if(outMaze(map,i,j-1)){//看看左边能不能走return true;}else{//当上下左右都走不通,就是走到死胡同了,游戏失败map[i][j] = 3;return false;}}else{return false;}} }
}