微信移动网站建设,2019一个网站开发要多少钱,网页创意的再设计,中铁建设集团有限公司电话号码原文链接:传送门
迷宫问题 说明:
小球得到的路径#xff0c;和程序员设置的找路策略有关即#xff1a;找路的上下左右的顺序相关再得到小球路径时#xff0c;可以先使用(下右上左)#xff0c;再改成(上右下左)#xff0c;看看路径是不是有变化测试回溯现象思考: 如何求出…原文链接:传送门
迷宫问题 说明:
小球得到的路径和程序员设置的找路策略有关即找路的上下左右的顺序相关再得到小球路径时可以先使用(下右上左)再改成(上右下左)看看路径是不是有变化测试回溯现象思考: 如何求出最短路径? //下面代码的找路策略是:下右上左
public static boolean setWay(int[][] map, int i, int j) {if (map[6][5] 2) { // 表示路已经找到了return true;} else {if (map[i][j] 0) { // 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 { //如果map(i)(j)!0 //则值 1,2,3return false;}
}}
int[][] map new int[8][7];
//上下全部置1
for(int i 0 ; i7;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;
}完整代码
package com.atguigu.recursion;/*** ClassName: br/* Description: br/* Date: 2021-02-22 9:50 br/* project data_algorithm* package com.atguigu.recursion*/
public class MiGong {public static void main(String[] args) {// 先创建一个二维数组模拟迷宫// 地图int[][] map new int[8][7];// 使用1 表示墙// 上下全部置为1for (int i 0; i 7; i) {map[0][i] 1;map[7][i] 1;}// 左右全部置为1for (int i 0; i 8; i) {map[i][0] 1;map[i][6] 1;}//设置挡板, 1 表示map[3][1] 1;map[3][2] 1;
// 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);setWay2(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 表示从地图的哪个位置开始出发 (1,1)//3. 如果小球能到 map[6][5] 位置则说明通路找到.//4. 约定 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 2 表示通路可以走 3 表示该点已经走过但是走不通//5. 在走迷宫时需要确定一个策略(方法) 下-右-上-左 , 如果该点走不通再回溯/*** * param map 表示地图* param i 从哪个位置开始找* param j * return 如果找到通路就返回true, 否则返回false*/public static boolean setWay(int[][] map, int i, int j) {if(map[6][5] 2) { // 通路已经找到okreturn true;} else {if(map[i][j] 0) { //如果当前这个点还没有走过//按照策略 下-右-上-左 走map[i][j] 2; // 假定该点是可以走通.if(setWay(map, i1, j)) {//向下走return true;} else if (setWay(map, i, j1)) { //向右走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 { // 如果map[i][j] ! 0 , 可能是 1 2 3return false;}}}//修改找路的策略改成 上-右-下-左public static boolean setWay2(int[][] map, int i, int j) {if(map[6][5] 2) { // 通路已经找到okreturn true;} else {if(map[i][j] 0) { //如果当前这个点还没有走过//按照策略 上-右-下-左map[i][j] 2; // 假定该点是可以走通.if(setWay2(map, i-1, j)) {//向上走return true;} else if (setWay2(map, i, j1)) { //向右走return true;} else if (setWay2(map, i1, j)) { //向下return true;} else if (setWay2(map, i, j-1)){ // 向左走return true;} else {//说明该点是走不通是死路map[i][j] 3;return false;}} else { // 如果map[i][j] ! 0 , 可能是 1 2 3return false;}}}}运行结果
地图的情况
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 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 Process finished with exit code 0通过递归,遍历所有方式的路径,共享棋盘中的数组位置数据 实现查找最优解 策略:下-右-上-左 最后噼里啪啦的回去了 回溯
原文链接:传送门