对于方案分配,我需要为2x2x2 rubick的球体编写一个强力求解器。
球体的一半可以向正/负x,y和z方向转动。
我的函数genStates意味着接受一个状态并从中生成6个状态,保存移动到达第二个列表中的那些状态(匹配索引以便稍后访问)
状态是位置和方向的列表((1 1)(2 1)(3 1)(4 1)(5 3)(6 3)(7 3)(8 3))并且与移动列表(“x”“Y”“y”“Z”)。
我的问题是我似乎无法以我喜欢的方式保存状态和动作。
(list
(list
;all states
)
(list
;all moves
)
)
我的genStates功能
(define (genStates n state moves)
(if (= n 0)
;if last recurse just return current state
(list state moves)
;else call helper
(genHelper n (generateSuccessorStates state moves))
)
)
我的genHelper功能
(define (genHelper n state)
(list
(append
(genStates (- n 1) (index (car state) 0) (index (cdr state) 0))
(genStates (- n 1) (index (car state) 1) (index (cdr state) 1))
(genStates (- n 1) (index (car state) 2) (index (cdr state) 2))
(genStates (- n 1) (index (car state) 3) (index (cdr state) 3))
(genStates (- n 1) (index (car state) 4) (index (cdr state) 4))
(genStates (- n 1) (index (car state) 5) (index (cdr state) 5)))
)
)
这种方法似乎在每6行状态之前将状态返回为(“x”“X”“y”“Y”“z”“Z”),而不是在结尾处作为移动列表。
我已经能够使用print语句生成正确的输出并且每次都不分支而不附加到列表但是我不确定如何从递归调用中收集数据。
我的generateSuccessorStates函数
(define (generateSuccessorStates state prevMoves)
(list
(list
(rotate "x" state)
(rotate "X" state)
(rotate "y" state)
(rotate "Y" state)
(rotate "z" state)
(rotate "Z" state)
)
(list
(append prevMoves '("x"))
(append prevMoves '("X"))
(append prevMoves '("y"))
(append prevMoves '("Y"))
(append prevMoves '("z"))
(append prevMoves '("Z"))
)
)
)
对于任何可能会看到这个问题的同学,我当然对你使用我的想法很好,但请不要只是将我的代码粘贴到你的项目中。对于所有参与者来说,这将会非常糟糕。