我正在使用广度优先搜索来解决高峰时段的游戏。它工作正常,但在困难的板上需要很长时间。我使用禁忌列表来避免我已经发现的状态,以避免疯狂的内存使用并提高运行时间。
我认为这个禁忌清单是长期运行的主要原因。与普通 BFS 相比,它确实大大缩短了时间,但它仍然太慢了。目前我使用的是普通列表(C#List
和List.Contains
方法)。我确信有更好的选择。
我将我的电路板存储为汽车列表 + 宽度、高度和目标点(您的汽车应该结束的位置)。a Car 存储为完全描述汽车的 2 个点(左上角和右下角)(因为它们只能水平或垂直放置)。
我能想到的一些事情:
- 一个特里
- 带有哈希码的东西
- 巨大的字典(?)
对于我的问题,什么是好的/最好的数据结构?谢谢您的帮助。
编辑1: 伪代码(X是禁忌列表类型):
void Solve(Board b)
Queue q = {b};
X taboo = {b};
while (q not empty)
Board next = q.Dequeue();
foreach (Board succ in next.Successors)
if (succ.IsSolved)
PrintSolution();
return;
if (!taboo.Contains(succ))
q.Enqueue(succ);
taboo.Add(succ);
WriteLine("No solution found");
编辑 2: 解决方案是使用 HashSet。(见下文)