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

浙公网安备 33010602011771号