如何解决我在 4 个块对象的列表上使用 DepthFirstSearch 并希望取回等于给定值的块大小的所有可能组合
我正在尝试获取四个块列表的所有排列。每个块都有一个 size 、visited 和 triangles 实例变量。我只用我的递归函数得到一个选项。有什么建议么?我想我没有重置目标值,但是当我这样做时会导致无限循环。
object LegoBlocks extends App{
class Block(x: Int){
var visited = false
var size = x
var reachedBy = 0
var adjacents = new ListBuffer[Block]()
def setSize(x: Int){
size = x
}
def getSize(): Int={
size
}
def setVisited(x: Boolean){
visited = x
}
def getVisited(): Boolean={
visited
}
def getReachedBy(): Int={
reachedBy
}
def setReachedBy(x: Int){
reachedBy = x
}
}
//create blocks
var block1 = new Block(1)
var block2 = new Block(2)
var block3 = new Block(3)
var block4 = new Block(4)
//add blocks to listing
var listing = List(block1,block2,block3,block4)
//set adjacents for blocks in listing
var target= 4
var results = new ListBuffer[List[Block]]()
var stack = new ListBuffer[Block]()
var option = new ListBuffer[Block]()
var start = listing(0)
dfs(start)
println(results)
// add start to stack
def dfs(start: Block){
stack += start
while(stack.length != 0){
println(s"Stack Length: ${stack.length}")
// pull first item off of stack
println(s"removing ${stack.last} from Stack")
var currentBlock = stack.last
stack -= stack.last
println(s"Stack $stack")
// set currentBlock equal to item from stack that you removed
println(s"Current Bloc size: ${currentBlock.size}")
// check currentBlocks.visited if false set it's visited value to true
if (currentBlock.visited == false){
println(s"Checked visited status of currentBlock $currentBlock,Visited : ${currentBlock.visited}")
currentBlock.visited = true
println(s"Changed visited status of currentBlock $currentBlock,Visited : ${currentBlock.visited}")
if(target - currentBlock.size > 0){
println(s"Target : $target")
// if target - currentBlock.size > 0
currentBlock.adjacents += new Block(1)
currentBlock.adjacents += new Block(2)
currentBlock.adjacents += new Block(3)
currentBlock.adjacents += new Block(4)
println(s"CurrentBlock adjacents are Now ${currentBlock.adjacents}")
//set currentBlock.adjacents = to new block1,newblock2.... all the way up to new block 4
println(s"Setting target from $target to ${target - currentBlock.size}")
target = target - currentBlock.size
println(s"Target is Now $target")
// set target to target - currentBlock.size
println(s"Adding current block size to options")
option += currentBlock
println(s"Options Now consists of $option")
// options += currentBlock.size
for(block <- currentBlock.adjacents){
println(s"Now checking currentBlocks adjacents and they are ${currentBlock.adjacents}")
// for (block <- currentBlock.adjacents)
println(s"Now working with adjacent $block of Block ${currentBlock.size} ")
println(s"Calling recursive dfs function on $block")
dfs(block)
println(s"Starting all over again.")
// dfs(block)
}
}
else if (target - currentBlock.size == 0){
println(s"Since target - currentBlock.size == 0 we are:")
// if target - currentBlock.size == 0
println(s"adding currentBlock to options")
option += currentBlock
println(s"Options Now contains $option")
//options += currentBlock.size
println(s"adding ${option.toList} list to results $results")
results += option.toList
println(s"results Now equals $results")
//results += options.toList
println(s"")
}
}
}
}
}
任何建议将不胜感激,因为我已经为此奋斗了几天。感谢您的时间。我使用了很多打印语句来更容易地遵循流程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。