// 编程之美1.13 nim(3) 两对石头的游戏
// 一种递归解法
package main
import (
"fmt"
)
// 两堆石头, 假定 n <= m
type pair struct {
n, m int
}
var mapsafe map[pair]bool
func main() {
mapsafe = make(map[pair]bool, 100)
nim(17, 24)
// 打印不安全局面
for k, v := range mapsafe {
if !v {
fmt.Println(k)
}
}
}
func nim(n, m int) bool {
if n == m {
return true
}
if n > m {
t := n
n = m
m = t
}
result, ok := mapsafe[pair{n, m}]
if ok {
return result
}
// 若 (i,m) 或 (i, m-n+i)中有不安全局面, 则(n, m)是安全的
for i := 1; i < n; i++ {
if !nim(i, m) || !nim(i, m-n+i) {
mapsafe[pair{n, m}] = true
return true
}
}
// 若 (n, i)中有不安全局面, 则(n, m)是安全的
for i := 1; i < m; i++ {
if !nim(n, i) {
mapsafe[pair{n, m}] = true
return true
}
}
mapsafe[pair{n, m}] = false
return false
}
编程之美 nim(3)的递归解法
猜你喜欢
转载自blog.csdn.net/zhout2009/article/details/79306776
今日推荐
周排行