微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我在 4 个块对象的列表上使用 DepthFirstSearch 并希望取回等于给定值的块大小的所有可能组合

如何解决我在 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 举报,一经查实,本站将立刻删除。