为什么我的代码不能解决我的golang回溯问题

问题描述 投票:0回答:1

我在学校遇到了以下问题,但我一生都无法找到解决方案。任何帮助将不胜感激:

一个盒子里有 9 个长方体(27 厘米 x 31 厘米 x 43 厘米)。你的任务是建造一座高度为 242 厘米的塔。根据长方体的位置,塔的高度因此增加 27.31 或 43 厘米。

使用回溯在 golang 中找到代码,它为您提供了解决此问题的所有可能的元组。

到目前为止,我已经有了这个,但它没有做我想做的事,它让我发疯:

package main

import "fmt"

var lv [9]int
var h [3]int= [3]int{27,31,43}
const max = 242

func setze(n int) {
    for i :=0; i <9; i++ {
        for j := 0; j<3; j++ {
            lv[i] = h[j]
        }
    }
    if passt(n) {
        if n == 9 {
            fmt.Println("Eine Lösung ist", lv)
            } else {
            setze(n+1)  
            }
    }
}
            
//Hilfsfunktion Summe
func sum(a []int) int { // gibt ein int zurück
   s := 0
   for i := 0; i < len(a); i++ {
   s = s+ a[i]
    }
    return s
}

//überprüft Bedingungen
func passt (n int) bool {
    return sum(lv[:]) == 242
}

func main() {
    setze(0)
}

go backtracking
1个回答
0
投票

主要问题是您的 setze 函数无法正确迭代塔中每个位置的选项。相反,它为塔中的每一层分配所有可能的高度,这不是预期的行为。

package main

import (
    "fmt"
)

var lv [9]int
var h [3]int = [3]int{27, 31, 43}
const max = 242

// setze tries to build the tower by placing a cuboid at level n.
func setze(n int, sum int) {
    // Base case: if the current height is exactly max and we used all cuboids, we print the solution.
    if sum == max && n == 9 {
        fmt.Println("Eine Lösung ist", lv[:n])
        return
    }

    // If the sum exceeds max or if we have placed all cuboids, we return.
    if sum > max || n >= 9 {
        return
    }

    // Try each type of cuboid at this level.
    for i := 0; i < len(h); i++ {
        lv[n] = h[i]
        setze(n+1, sum + h[i])
    }
}

func main() {
    setze(0, 0)
}
© www.soinside.com 2019 - 2024. All rights reserved.