6-递归迷宫问题-Scala实现

0表示未被探测过,1表示墙,2表示经过探测是通路,3经过探测发现是死路。

给出两种策略,下右上左;上右下左

package com.atguigu.datastructures.recursion

object MiGong {
  def main(args: Array[String]): Unit = {
    //1,创建迷宫
    val map = Array.ofDim[Int](8,7)
    //2,给map地图,加墙

    //给最上面和最下面设置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
    }
    println("迷宫的情况")
    for (row <- map){
      for (item <- row){
        printf("%d ",item)
      }
      println()
    }
    //墙
    map(3)(1)=1
    map(3)(2)=1
    map(2)(2)=1


    //测试一下是否ok
    setWay2(map,1,1)
    println("小球递归回溯后的情况")
    for (row <- map){
      for (item <- row){
        printf("%d ",item)
      }
      println()
    }


  }
//修改策略
def setWay2(map:Array[Array[Int]],i:Int,j:Int):Boolean={
  if (map(6)(5)==2){//表示通路已经找到
    return true
  }else{
    //说明map(i)(j)取值0,1,2,3
    if (map(i)(j)==0){//说明该点还没有被探测过
      //用自己的策略
      //先将map(i)(j),假定该点可以走通,但不一定
      map(i)(j)=2
      //向上
      if (setWay2(map,i-1,j)){
        return true
      }else if(setWay2(map,i,j+1)){//向右
        return true
      }else if (setWay2(map,i+1,j)){ //下
        return true
      }else if (setWay2(map,i,j-1)){
        //左
        return true
      }else{
        //说明该点四个方向都无法到达终点
        map(i)(j)=3
        return false
      }

    }else{//1,2,3

      return false
    }



  }
}

  //编写一个方法完成找路
  /**
    * 功能完成递归回溯找路
    * @param map 地图
    * @param i  表示现在正在探测哪个位置的横坐标
    * @param j  表示现在正在探测哪个位置的纵坐标
    */
  def setWay(map:Array[Array[Int]],i:Int,j:Int):Boolean={
    if (map(6)(5)==2){//表示通路已经找到
      return true
    }else{
      //说明map(i)(j)取值0,1,2,3
      if (map(i)(j)==0){//说明该点还没有被探测过
        //用自己的策略
        //先将map(i)(j),假定该点可以走通,但不一定
        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{//1,2,3

        return false
         }



    }
  }

}

  

 

posted @ 2020-06-11 15:26  济默  阅读(139)  评论(0编辑  收藏  举报