您的位置:首页 > 其它

scala 回溯法解决迷宫问题

2016-09-14 18:43 330 查看
//回溯法(递归版本)
object MiGong extends App{
import scala.collection.mutable.ArrayBuffer
val migong = Array(
Array(1,1,1,1,1,1,1,1,1,1),
Array(1,0,0,1,1,0,0,1,0,1),
Array(1,0,0,1,0,0,0,1,0,1),
Array(1,0,0,0,0,1,1,0,0,1),
Array(1,0,0,1,1,0,0,0,0,1), //Array(1,0,1,1,1,0,0,0,0,1),
Array(1,0,0,0,1,0,0,0,0,1),
Array(1,0,1,0,0,0,1,0,0,1),
Array(1,0,1,1,1,0,1,1,0,1),
Array(1,1,0,0,0,0,0,0,0,1),
Array(1,1,1,1,1,1,1,1,1,1))
val direction = Map(0->(0,-1),1->(-1,0),2->(0,1),3->(1,0)) //左、上、右、下
// var minpath = ArrayBuffer[(Int,Int)]()
var minpath = ArrayBuffer[Array[(Int,Int)]]()
val path = ArrayBuffer[(Int,Int)]((1->1))
var minlength = Long.MaxValue
var length = 1
def search(xd:Int,yd:Int,xt:Int,yt:Int):Unit={
if(xd == xt && yd == yt){
// if(length < minlength){
// 	minlength = length
// 	minpath = path.clone() //可能有多条最短的路径
// }
if(length < minlength){
minlength = length
minpath = ArrayBuffer[Array[(Int,Int)]]()
}
if(length == minlength){
minpath += path.toArray
}
return
}
for(i <- 0.until(4)){
val newxd = xd+direction(i)._1
val newyd = yd+direction(i)._2
if(migong(newxd)(newyd) == 0){
migong(newxd)(newyd) = 1
length += 1
path += (newxd->newyd)
search(newxd,newyd,xt,yt)
migong(newxd)(newyd) = 0
length -= 1
path -= (newxd->newyd)
}
}
}
search(1,1,8,2)
migong(1)(1) = 1
println(minlength)
// println(minpath.mkString)
println(minpath.map(a => println(a.mkString)))
println(minpath.size)
}

//回溯法(非递归版本)
object MiGong2 extends App{
import scala.collection.mutable.Stack
import scala.collection.mutable.ArrayBuffer
val migong = Array(
Array(1,1,1,1,1,1,1,1,1,1),
Array(1,0,0,1,1,0,0,1,0,1),
Array(1,0,0,1,0,0,0,1,0,1),
Array(1,0,0,0,0,1,1,0,0,1),
Array(1,0,0,1,1,0,0,0,0,1), //Array(1,0,1,1,1,0,0,0,0,1),
Array(1,0,0,0,1,0,0,0,0,1),
Array(1,0,1,0,0,0,1,0,0,1),
Array(1,0,1,1,1,0,1,1,0,1),
Array(1,1,0,0,0,0,0,0,0,1),
Array(1,1,1,1,1,1,1,1,1,1))
val direction = Map(0->(0,-1),1->(-1,0),2->(0,1),3->(1,0)) //左、上、右、下
val stack = new Stack[(Int,Int,Int)]()
var minpath = ArrayBuffer[Array[(Int,Int)]]()
var minlength = Long.MaxValue
var length = 1
stack.push((1,1,0)) //三元组:x,y,d
migong(1)(1) = 1
//起点:(1,1),终点:(8,2)
while(!stack.isEmpty){
val x = stack.top._1
val y = stack.top._2
var d = stack.top._3
if(x == 8 && y == 2){
if(stack.size < minlength){
minlength = stack.size
minpath = ArrayBuffer[Array[(Int,Int)]]()
}
if(stack.size == minlength){
minpath += stack.reverse.toArray.map(a => (a._1,a._2))
}
}
var tag = false
while(d<4 && !tag){
if(migong(x+direction(d)._1)(y+direction(d)._2) == 0) tag = true
d += 1
}
if(tag){
stack.pop
stack.push((x,y,d))
stack.push((x+direction(d-1)._1,y+direction(d-1)._2,0))
migong(x+direction(d-1)._1)(y+direction(d-1)._2) = 1
} else {
stack.pop
migong(x)(y) = 0
}
}
println(minlength)
println(minpath.map(a => println(a.mkString)))
println(minpath.size)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 scala