递归(recursive)-迷宫回溯问题

思路分析

  1. 创建一个二维数组(表示地图)。
  2. 约定不同的数字表示不同的含义。元素的值,0:表示可以走还没走过,1:墙,2:表示可以走,3:表示已经走过了,但是是死路。
  3. 确定一个策略。下->右->上->左。

代码实现

package chapter18.recursive

object MiGong {
  def main(args: Array[String]): Unit = {
    //地图
    val map = Array.ofDim[Int](8, 7)
    //上下全部置1
    for (i <- 0 until 7) {
      map(0)(i) = 1
      map(7)(i) = 1
    }
    //左右全部置1
    for (i <- 0 until 8) {
      map(i)(0) = 1
      map(i)(6) = 1
    }
    //设置挡板
    map(3)(1) = 1
    map(3)(2) = 1
    //    map(1)(2) = 1
    //    map(2)(2) = 1
    //打印地图
    for (i <- 0 until 8) {
      for (j <- 0 until 7) {
        print(map(i)(j) + " ")
      }
      println()
    }
    // 测试
    setWay(map, 1, 1)
    println("\n----------------运行后------------------------\n")
    //打印新地图
    for (i <- 0 until 8) {
      for (j <- 0 until 7) {
        print(map(i)(j) + " ")
      }
      println()
    }
  }

  /**
   * 使用递归回溯来找路
   * 约定不同的数字表示不同的含义。元素的值,0:表示可以走还没走过,1:墙,2:表示可以走,3:表示已经走过了,但是是死路。
   * 确定一个策略:下-》右-》上-》左
   *
   * @param map 表示地图,
   * @param i   行号:是指定从地图的哪个点开始出发 (1,1)
   * @param j   列号:是指定从地图的哪个点开始出发 (1,1)
   * @return 是否能走
   */
  def setWay(map: Array[Array[Int]], i: Int, j: Int): Boolean = {
    if (map(6)(5) == 2) {
      //表示路已经通了
      return true
    } else {
      if (map(i)(j) == 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,3
        return false
      }
    }
  }

}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值