我正在构建一个数独求解器。我在大约一年前用Python构建了一个,我真的很喜欢我的数据组织方式。我在python中做了如下:
每一行都是一个字母,每列都是一个数字。 (所以左上角的单元格是'A1',右下角的单元格是'I9',右上角是'A9'等。
这些“单元名称”在字典中用作键。
附加到每个键的值表示单元格可以合法存储的所有可能值(根据数独的规则)。因此每个键的起始值为'123456789'。
我有其他列表代表哪些单元格是'兄弟'。 (相同的行/列/ 3x3框)。如果一个单元格已被“解密”,那么它在dict中的值将减少到它已解决的整数。
任何'兄弟'单元格到已解决的单元格,然后将“已解决”整数从其值中删除。 (它不再是该单元格的潜在价值)
每当密钥的值为长度1时,表示“已解决”的单元格。
例如,假设'A3'已经解决为8.它将具有关键:dict中的值为'A3':'8'。我的方法会注意到这一点,对于每个'兄弟'单元格(所有'Ax'单元格,所有'y3'单元格和3x3框'A3'都在(A1-3,B1-3,C1-3)中从他们的价值观中删除'8'。 在'A3'变为'8'之前说'B2':'1234789'。之后,'B2':'123479'
这是一个部分解决的谜题的例子以及它将如何存储在我的python代码中:
{'I6': '123456789', 'H9': '2', 'I2': '3', 'E8': '123456789', 'H3': '5', 'H7': '123456789', 'I7':
'123456789', 'I4': '1', 'H5': '4', 'F9': '123456789', 'G7': '123456789', 'G6': '123456789', 'G5': '2',
'E1': '4', 'G3': '9', 'G2': '4', 'G1': '6', 'I1': '2', 'C8': '123456789', 'I3': '7', 'E5': '1', 'I5':
'123456789', 'C9': '7', 'G9': '123456789', 'G8': '8', 'A1': '7', 'A3': '123456789', 'A2': '6', 'A5':
'123456789', 'A4': '2', 'A7': '123456789', 'A6': '123456789', 'C3': '123456789', 'C2': '123456789',
'C1': '3', 'E6': '123456789', 'C7': '123456789', 'C6': '4', 'C5': '5', 'C4': '123456789', 'I9':
'123456789', 'D8': '123456789', 'I8': '123456789', 'E4': '123456789', 'D9': '123456789', 'H8':
'7', 'F6': '123456789', 'A9': '123456789', 'G4': '123456789', 'A8': '5', 'E7': '5', 'E3': '6',
'F1': '123456789', 'F2': '123456789', 'F3': '123456789', 'F4': '123456789', 'F5': '3', 'E2':
'7', 'F7': '7', 'F8': '123456789', 'D2': '5', 'H1': '1', 'H6': '6', 'H2': '8', 'H4': '3',
'D3': '3', 'B4': '123456789', 'B5': '6', 'B6': '123456789', 'B7': '123456789', 'E9':
'123456789', 'B1': '5', 'B2': '123456789', 'B3': '123456789', 'D6': '123456789', 'D7':
'123456789', 'D4': '123456789', 'D5': '7', 'B8': '123456789', 'B9': '123456789', 'D1': '8'}
我无法弄清楚如何在Java中设置它。我对HashMaps没有任何经验,但是通过阅读它们,看起来它们可能是填补我的词典角色的好人选。如果我走这条路线,我可以采用哪些不同的方式将值存储在HashMap中(默认为'123456789',但能够在任何时候由于'兄弟'单元格而无效时从值中删除特定数字只有其值中的特定数字。)
很抱歉,如果这令人困惑,感谢任何阅读它的人。一旦我得到了数据结构,我就会很好地掌握如何创建方法来“减弱”每个单元格POTENTIAL_VALUES(dict中的值)直到每个单元格(键)只剩下一个值(表示解决了难题)。
答案 0 :(得分:1)
可能性列表最好由一组表示。
Set<Integer>
可能性的细胞词典自然地转换为地图。
Map<Cell, Set<Integer>>
请注意,我使用的是抽象Set
和Map
类型,而不是具体实现。您需要选择具体类来实例化变量,但变量类型应使用抽象类型。这就是我的意思:
Map<Cell, Set<Integer>> cellValues = new HashMap<>();
for (Cell cell: Cell.all()) {
cellValues.put(cell, new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)));
}
HashMap
和HashSet
是具体的类。
另请注意,我使用的是Cell
类,而不是直接使用"A1"
等字符串。在Python中,使用字符串很容易,并且创建一个单独的类可能会有点过分。在Java中,创建Cell
类绝对是一种很好的做法。