image.png

    1. package com.atguigu.recursion;
    2. /**
    3. * 迷宫问题
    4. * @author Dxkstart
    5. * @create 2021-10-09-11:17
    6. */
    7. public class MiGong {
    8. public static void main(String[] args) {
    9. //先创建一个二维数组,模拟迷宫
    10. //地图
    11. int[][] map = new int[8][7];
    12. //将迷宫的上下行置为1,模拟墙
    13. for (int i = 0; i < 7; i++) {
    14. map[0][i] = 1;
    15. map[7][i] = 1;
    16. }
    17. //将迷宫的左右列置为1,模拟墙
    18. for (int i = 0; i < 8; i++) {
    19. map[i][0] = 1;
    20. map[i][6] = 1;
    21. }
    22. //地图中的其余的墙
    23. map[3][1] = 1;
    24. map[3][2] = 1;
    25. //输出地图
    26. System.out.println("地图的情况为:");
    27. for (int i = 0; i < 8; i++) {
    28. for (int j = 0; j < 7; j++) {
    29. System.out.print(map[i][j] + " ");
    30. }
    31. System.out.println();
    32. }
    33. //使用递归回溯给小球找路
    34. setWay(map,1,1);
    35. //输出新的地图,小球走过,并标识过的递归
    36. System.out.println("新地图的情况为:");
    37. for (int i = 0; i < 8; i++) {
    38. for (int j = 0; j < 7; j++) {
    39. System.out.print(map[i][j] + " ");
    40. }
    41. System.out.println();
    42. }
    43. }
    44. //使用递归回溯来给小球找路
    45. //1.map表示地图
    46. //2.i,j 表示从地图的那个位置开始出发(1,1)
    47. //3.如果小球能到map[6][5]位置,则说明通路找到
    48. //4.约定:当map[i][j] 为0表示该点没有走过,当为1表示为墙,2表示通路可以走,3表示该点已经走过,但是走不通
    49. //5.在走迷宫时,需要确定一个策略(方法),下->右->上->左,如果该点走不通,再回溯
    50. /**
    51. *
    52. * @param map 表示地图
    53. * @param i 从哪个位置开始找
    54. * @param j
    55. * @return 如果找打通路,返回true,否则返回false
    56. */
    57. public static boolean setWay(int[][] map,int i,int j){
    58. if (map[6][5] == 2){//通路已经找到,ok了
    59. return true;
    60. }else {
    61. if (map[i][j] == 0){//如果当前这个点还没有走过
    62. //按照策略 下->右->上->左 走
    63. map[i][j] = 2;//假定该点是可以走通的
    64. if (setWay(map, i+1, j)){//向下走
    65. return true;
    66. }else if (setWay(map, i, j+1)){//向右走
    67. return true;
    68. }else if (setWay(map, i-1, j)){//向上走
    69. return true;
    70. }else if (setWay(map, i, j-1)){//向左走
    71. return true;
    72. }else {
    73. //说明该点是死路,走不通
    74. map[i][j] = 3;
    75. return false;
    76. }
    77. }else {//如果map[i][j] != 0,可能是1,2,3
    78. return false;
    79. }
    80. }
    81. }
    82. }

    image.png