编程之美 nim(3)的递归解法

 
 
// 编程之美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
}


 

猜你喜欢

转载自blog.csdn.net/zhout2009/article/details/79306776