zoukankan      html  css  js  c++  java
  • 递归—迷宫问题

    迷宫问题

    说明:

      (1)小球得到的路径,和程序员设置的找路策略有关系:找路的上下左右的顺序有关

      (2)再得到小球路径时,可以先试用(下右上左),可以先使用(下右上左),再改成(上右下左),看看路径是否有变化

      (3)测试回溯现象

      (4)思考:如何求出最短路径?

              

    代码分析:

      1 package com.java.recursion;
      2 
      3 public class MiGong {
      4 
      5     public static void main(String[] args) {
      6         
      7         // 先创建一个二维数组,模拟迷宫
      8         // 地图
      9         int[][] map = new int[8][7];
     10         
     11         // 用1表示墙
     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         //输出地图
     27         System.out.println("地图情况");
     28         for(int i = 0;i<8;i++) {
     29             for(int j =0;j<7;j++) {
     30                 System.out.print(map[i][j]+" ");
     31             }
     32             System.out.println();
     33         }
     34         
     35 //        //使用 递归回溯给小球找路
     36 //        boolean flag = setWay(map, 1, 1);
     37 //        
     38 //        //输出地图
     39 //        System.out.println("小球走过的路,标识的地图");
     40 //        for(int i = 0;i<8;i++) {
     41 //            for(int j =0;j<7;j++) {
     42 //                System.out.print(map[i][j]+" ");
     43 //            }
     44 //            System.out.println();
     45 //        }
     46         
     47         boolean flag2 = setWay2(map, 1, 1);
     48         //输出地图
     49         System.out.println("小球走过的路,标识的地图");
     50         for(int i = 0;i<8;i++) {
     51             for(int j =0;j<7;j++) {
     52                 System.out.print(map[i][j]+" ");
     53             }
     54             System.out.println();
     55         }
     56 
     57     }
     58     
     59     
     60     // 使用递归回溯来给小球找路
     61     // 说明
     62     // 1. map 表示地图
     63     // 2. i,j 表示从地图的那个位置开始出发
     64     // 3. 如果小球到 map[6][5] 位置,则说明通路找到
     65     // 4. 约定:当map[i][j] 为0表示该点没有走过;当为1表示墙;2表示通路,可以走;
     66     //        3表示该位置以及走过,但是走不通
     67     // 5.在走迷宫时,需要确定一个策略(方法),下—>右—>上—>左,如果该点走不通,再回溯
     68     /**
     69      * 
     70      * @param map 表示地图
     71      * @param i   从那个位置开始找
     72      * @param j   
     73      * @return    找到通路就返回true,否则返回false
     74      */
     75     public static boolean setWay(int[][] map,int i,int j) {
     76         if(map[6][5] == 2) {  // 通路已经找到OK
     77             return true;
     78         } else {
     79             if(map[i][j] == 0) { // 如果当前这个点没有走过
     80                 // 按照策略走 下->右->上->左
     81                 map[i][j] = 2;   // 假定该点是可以走通的。
     82                 if(setWay(map,i+1,j)) {  //向下走
     83                     return true;
     84                 } else if(setWay(map,i,j+1)) {  //向右走
     85                     return true;
     86                 } else if(setWay(map,i-1,j)) {  //向上走
     87                     return true;
     88                 } else if(setWay(map,i,j-1)) {  // 向左走
     89                     return true;
     90                 } else {
     91                     // 说明该点是走不通的,是死路
     92                     map[i][j] = 3;
     93                     return false;
     94                 }
     95             } else {   // 如果map[i][j] !=0,可能是1,2,3
     96                 return false;
     97             }
     98         }
     99     }
    100     
    101     // 第二种策略
    102     public static boolean setWay2(int[][] map,int i,int j) {
    103         if(map[6][5] == 2) {  // 通路已经找到OK
    104             return true;
    105         } else {
    106             if(map[i][j] == 0) { // 如果当前这个点没有走过
    107                 // 按照策略走 上->右->下->左
    108                 map[i][j] = 2;   // 假定该点是可以走通的。
    109                 if(setWay2(map,i-1,j)) {       //向上走
    110                     return true;
    111                 } else if(setWay2(map,i,j+1)) {  //向右走
    112                     return true;
    113                 } else if(setWay2(map,i+1,j)) {  //向下走
    114                     return true;
    115                 } else if(setWay2(map,i,j-1)) {  // 向左走
    116                     return true;
    117                 } else {
    118                     // 说明该点是走不通的,是死路
    119                     map[i][j] = 3;
    120                     return false;
    121                 }
    122             } else {   // 如果map[i][j] !=0,可能是1,2,3
    123                 return false;
    124             }
    125         }
    126     }
    127 
    128 }
  • 相关阅读:
    NC 工具的使用教程
    centos7&redhat 之 firewalld 详细介绍配置
    rabbitmq&&erlang 安装
    centos7 rabbitmq 安装
    Centos7 Erlang Solutions 安装
    CentOS7 LVM添加硬盘及扩容
    Linux服务器上监控网络带宽的18个常用命令
    在PowerDesigner中自动生成sqlserver字段备注
    JS 验证URL
    GitHub上整理的一些工具【转载】
  • 原文地址:https://www.cnblogs.com/niujifei/p/11787722.html
Copyright © 2011-2022 走看看