【发布时间】:2013-03-15 16:33:15
【问题描述】:
我正在使用in this youtube video 描述的回溯算法。
现在,我应该能够获得所有可能的解决方案。我能用回溯算法做到这一点吗?如何做到的?如果不可能,我应该使用哪种其他(简单)算法?
【问题讨论】:
-
你试过了吗?
标签: c# solution sudoku backtracking
我正在使用in this youtube video 描述的回溯算法。
现在,我应该能够获得所有可能的解决方案。我能用回溯算法做到这一点吗?如何做到的?如果不可能,我应该使用哪种其他(简单)算法?
【问题讨论】:
标签: c# solution sudoku backtracking
这个问题不太适合这个网站,因为它似乎与实际代码无关。
但无论如何我都会试一试。
当然,您可以使用回溯算法获得所有可能的解决方案。记住回溯算法的工作原理:
while(仍有猜测可用)
做一个猜想
用猜测解决难题
如果有解决方案,则记录解决方案并退出循环。
从可能的猜测列表中划掉猜测
如果你记录了一个解决方案,那么这个难题是可以解决的。
如果您想要所有解决方案,只需将算法修改为:
while(仍有猜测可用)
做一个猜想
用猜测解决难题
如果有解决方案,则记录解决方案。不要放弃。
从可能的猜测列表中划掉猜测
如果您记录了任何解决方案,那么这个难题是可以解决的。
顺便说一句,我写了一系列关于在 C# 中使用图形着色回溯算法解决数独的博客文章;您可能会感兴趣:
在这段代码中你会看到这一行:
return solutions.FirstOrDefault();
“解决方案”包含一个枚举所有解决方案的查询。我只想要第一个这样的解决方案,所以这就是我要求的。如果您想要所有解决方案,只需重写程序,使其不会调用FirstOrDefault。请参阅下面的 cmets 了解一些注意事项。
【讨论】:
return solutions.FirstOrDefault();——如果您想要每个解决方案,只需将FirstOrDefault 去掉,然后返回solutions。
FirstOrDefault那么简单。
FirstOrDefault 来获得第一个,但是由于你将它内置到算法中,所以它变得更加困难走另一条路。
Solve进行的更改:第一个基本情况需要更改为:return new[] { this.possibilities.SelectMany(x => x) };第二个基本情况需要更改为:return Enumerable.Empty<IEnumerable<int>>();,第三个基本情况需要更改为:return solutions.SelectMany(x => x);。 Solve 的签名也需要改为IEnumerable<IEnumerable<int>>。现在,这并不是一个巨大的巨大变化,但我不知道我是否希望任何人都能够在没有明显时间投入的情况下做到这一点。