递归

 

 

 

 

 

 

package chapter05

object test03 {

  def main(args:Array[String]):Unit={

    //1.创建迷宫,使用二维数组map(8)(7)

    val map = Array.ofDim[Int](8,7)

    //2.给地图加墙
    //0:没有探测过
    //1:表示墙
    //2. 表示经过探测是通路
    //3. 表示经过探测是死路

    //最上边和下边加墙
    for(i <- 0 until 7){
      map(0)(i)=1
      map(7)(i)=1
    }

    //最左边和最右边加墙
    for(i <- 0 until 6){
      map(i)(0)=1
      map(i)(6)=1
    }

    map(3)(1)=1
    map(3)(2)=1
    map(2)(2)=1

    println("迷宫的情况是:")
    for(row <- map){
      for (item <- row){
        printf("%d ",item)
      }
      println()
    }

    setWay(map,1,1)

    println("迷宫的情况是:")
    for(row <- map){
      for (item <- row){
        printf("%d ",item)
      }
      println()
    }

    //编一个方法,探测该点是否可以走
    // map:地图,i探测位置的横坐标,j 探测位置的纵坐标
    def setWay(map:Array[Array[Int]],i:Int,j:Int): Boolean ={

      if(map(6)(5)==2){//路走通
        return true
      }else{//map的可能取值为0,1,3
        if(map(i)(j)==0){//说明该点还没有探测过

          //使用策略探测该点(下=》右=》上=》左)
          //假定这个点是走的通map(i)(j)=2
          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
        }

      }

    }


  }

}

 

package chapter05

object hannoTower {


  def main(args:Array[String]):Unit={
    hannoTower(3,'a','b','c')
  }

  def hannoTower(num:Int,a:Char,b:Char,c:Char):Unit={
    //如果只有一个盘子
    if(num==1){
      println("盘子1"+ " "+a+"=>"+c)

    }else{
      //如果有两个或者两个以上的盘子
      //1.将a塔 上面的盘 a=>b
      //2.将a塔 最下面的盘 a=>c
      //3.将b塔的所有盘移动到c, b=>c

      hannoTower(num-1,a,c,b)
      println("盘子"+num + " "+a+"=>"+c)
      hannoTower(num-1,b,a,c)

    }
  }


}

 

posted on 2020-08-27 18:31  happygril3  阅读(115)  评论(0)    收藏  举报

导航