我在学校遇到了以下问题,但我一生都无法找到解决方案。任何帮助将不胜感激:
一个盒子里有 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)
}
主要问题是您的 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)
}