我正在考虑制作一个数独求解器,我有两个问题:
1)什么会更快?
A)浏览所有空白点,有一个数字列表(1-9)如果它在同一行或同一类别中则删除它们,如果它是长度1,则添加剩下的唯一一个。需要时重复此操作。
B)浏览所有数字,然后检查所有点,看看他们是否可以拥有该号码。需要时重复此操作。
2)保留长度不超过9的列表的最有效列表是什么?
谢谢,
图例
答案 0 :(得分:1)
答案2)不是列表,而是一组有意义。在这种情况下BitSet
。
案例1)9x9数独中有27条规则。
案例1A)每个地点都参与3条规则。
案例1B)每个号码重复9次;出现在3条规则中。
答案1)1A和1B理论上应该没有区别,但1A似乎是一个算法&数据结构更容易。
答案 1 :(得分:1)
我认为B有效!您可以使用回溯算法使用1-9个数字中的任何一个(按顺序)检查空白点。填写第一个可用选项(1-9)并继续前进。如果您在任何时候无法在插槽中插入号码,请回溯到上一个插槽并尝试使用其他号码。 这可能会有所帮助:
http://edwinchan.wordpress.com/2006/01/08/sudoku-solver-in-c-using-backtracking/