您不必显式构建图形。在概念上,您可以将问题表示为图形,其中节点是状态,边是状态之间的转换。深度优先搜索是一直跟随边缘,直到达到最终状态,然后再移动到另一边。所以它看起来是这样的(伪):
def search(state):
if is_end_state(state):
# search down this branch finished, do something
return something
for move in possible_moves_from(state):
search(apply_move(state, move))
你最终会隐含构建图形,通过递归调用和堆栈状态,当您去。
请注意,如果您有循环(例如,您可以向左移动,然后向右移动回到完全相同的状态),那么您将不得不跟踪已经访问过的状态,否则将永远循环。事情是这样的:
def search(state, seen_states):
if state in seen_states:
# already visited, don't visit again
return
seen_states.add(state)
# same as before:
if is_end_state(state):
return something
for move in possible_moves_from(state):
search(apply_move(state, move), seen_states)
在如何实现这个方面,我建议你seen_states
是HashSet<State>
,你让你的State
哈希的。
因此,基本上这只会搜索一条路径,然后倒带,直到找到解决方案?我如何判断当前状态中是否存在可能的状态之一?我的意思是,如果我将棋子移位得足够多,我会得到重复的状态,并且会永久循环。 – Brejuro
@Brejuro:查看更新。你只需要跟踪已经看到的状态,如果你已经看到它,就不要去那里。通过保持一套。 – Claudiu
感谢您的帮助,将它作为图形进行建模是否合理?就像我在添加节点和边缘一样?我计划也实现其他搜索算法,所以我不确定使用图形实现是否有用。 – Brejuro