【问题标题】:Knight's tour with Warnsdorff's Rule: Determine all solutionsKnight 的 Warnsdorff 规则之旅:确定所有解决方案
【发布时间】:2012-12-23 16:23:54
【问题描述】:

我使用 Haskell 为 Knight's tour 实现了一个递归解决方案。我的算法基本上是基于 Warnsdorff 的规则。

例子:

  • 棋盘尺寸:5x5
  • 起始位置:(3,3)

基于这个例子的基本思路:

(1) 从当前点 (3,3) 计算允许的移动
=> (1,2),(1,4),(2,1),(2,5),( 4,1),(4,5),(5,2),(5,4)

(2) 对于这些点中的每一个,计算到达该点可以执行的移动次数(“入口”的数量)
=> ((1,2),2), ((1,4),2),((2,1),2),((2,5),2),((4,1),2),((4,5),2), ((5,2),2),((5,4),2)

(3) 如果所有点的入口数量相同,则找到入口最少的点或第一个点
=> (1,2)

(4) 调用与确定点相同的函数(开始递归)

这样我就能确定解决问题的方法。但现在我需要确定起始位置的所有其他可能解决方案(在示例 (3,3) 中)。 不幸的是,我真的不知道如何实现这一目标。

非常感谢您的想法。

这是我当前的 Haskell 代码(为指定的起始位置提供一种解决方案):

> kt :: Int -> (Int,Int) -> [(Int,Int)]
> kt dimension startPos = kt' (delete startPos allFields) [startPos] startPos
>   where allFields = [(h,v) | h <- [1..dimension], v <- [1..dimension]]
>         kt' :: [(Int,Int)] -> [(Int,Int)] -> (Int,Int) -> [(Int,Int)]
>         kt' [] moves _ = moves
>         kt' freeFields moves currentPos
>           | nextField /= (0,0) = kt' (delete nextField freeFields) (moves ++ [nextField]) nextField
>           | otherwise = error "Oops ... dead end!"
>           where h            = fst currentPos
>                 v            = snd currentPos
>                 nextField    = if nextFieldEnv /= [] then fst (head (sortBy sortGT nextFieldEnv)) else (0,0)
>                 nextFieldEnv = fieldEnv' currentPos freeFields


> sortGT ((a1,a2),a3) ((b1,b2),b3)
>  | a3 > b3 = GT
>  | a3 < b3 = LT
>  | a3 == b3 = EQ

> fieldEnv :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
> fieldEnv field freeFields = [nField | nField <- [(hor-2,ver-1),(hor-2,ver+1),(hor-1,ver-2),(hor-1,ver+2),(hor+1,ver-2),(hor+1,ver+2),(hor+2,ver-1),(hor+2,ver+1)], nField `elem` freeFields]
>  where hor = fst field
>        ver = snd field

> fieldEnv' :: (Int,Int) -> [(Int,Int)] -> [((Int,Int),Int)]
> fieldEnv' field freeFields = [(nField,length (fieldEnv nField freeFields)) | nField <- (fieldEnv field freeFields)]
>  where hor = fst field
>        ver = snd field

【问题讨论】:

  • 你能没有特殊选择规则解决这个问题吗?你知道如何解决其他类似的回溯问题(N 个皇后等)吗?
  • 您能描述一下“特殊选择规则”的含义吗?我没有尝试解决 N Queens Problem 或类似问题,但我认为就计算时间而言,我的实现非常有效。比我首先尝试的“简单”回溯方法效率更高(当然,速度要慢得多)。
  • 恐怕如果你想要所有的旅行,无论如何你都会有一个缓慢的算法,对于不太小的板来说,从起点开始的开放旅行的数量是巨大的。
  • 好的。谢谢四位您的回答!

标签: haskell knights-tour


【解决方案1】:

社区 wiki 回答最终近似于解决方案:

“恐怕如果你想要所有的旅行,无论如何你都会有一个缓慢的算法,对于不太小的板来说,从起点开始的开放旅行的数量是巨大的”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多