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 } } } }