zcq

    1. package com.atguigu.recursion;
    2. public class MiGong {
    3. public static void main(String[] args) {
    4. // 先创建一个二维数组,模拟迷宫
    5. // 地图
    6. int[][] map = new int[8][7];
    7. // 使用1 表示墙
    8. // 上下全部置为1
    9. for (int i = 0; i < 7; i++) {
    10. map[0][i] = 1;
    11. map[7][i] = 1;
    12. }
    13. // 左右全部置为1
    14. for (int i = 0; i < 8; i++) {
    15. map[i][0] = 1;
    16. map[i][6] = 1;
    17. }
    18. //设置挡板, 1 表示
    19. map[3][1] = 1;
    20. map[3][2] = 1;
    21. // map[1][2] = 1;
    22. // map[2][2] = 1;
    23. // 输出地图
    24. System.out.println("地图的情况");
    25. for (int i = 0; i < 8; i++) {
    26. for (int j = 0; j < 7; j++) {
    27. System.out.print(map[i][j] + " ");
    28. }
    29. System.out.println();
    30. }
    31. //使用递归回溯给小球找路
    32. //setWay(map, 1, 1);
    33. setWay2(map, 1, 1);
    34. //输出新的地图, 小球走过,并标识过的递归
    35. System.out.println("小球走过,并标识过的 地图的情况");
    36. for (int i = 0; i < 8; i++) {
    37. for (int j = 0; j < 7; j++) {
    38. System.out.print(map[i][j] + " ");
    39. }
    40. System.out.println();
    41. }
    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. //修改找路的策略,改成 上->右->下->左
    83. public static boolean setWay2(int[][] map, int i, int j) {
    84. if(map[6][5] == 2) { // 通路已经找到ok
    85. return true;
    86. } else {
    87. if(map[i][j] == 0) { //如果当前这个点还没有走过
    88. //按照策略 上->右->下->左
    89. map[i][j] = 2; // 假定该点是可以走通.
    90. if(setWay2(map, i-1, j)) {//向上走
    91. return true;
    92. } else if (setWay2(map, i, j+1)) { //向右走
    93. return true;
    94. } else if (setWay2(map, i+1, j)) { //向下
    95. return true;
    96. } else if (setWay2(map, i, j-1)){ // 向左走
    97. return true;
    98. } else {
    99. //说明该点是走不通,是死路
    100. map[i][j] = 3;
    101. return false;
    102. }
    103. } else { // 如果map[i][j] != 0 , 可能是 1, 2, 3
    104. return false;
    105. }
    106. }
    107. }
    108. }