面向对象设计与数独游戏

3
我正在尝试使用OOD设计数独谜题。
一方面,使用矩阵来表示棋盘,并在每次插入后激活验证函数似乎很便宜。
另一方面,使用“块”来表示棋盘可能更方便:每个单元格将被分配给包含它的三个块 - 列、行、正方形。这里的验证函数将根据块类(列/行/正方形)而不同地实现多态,当您插入数字时,它将在属于单元格的每个块上激活3次。
这种方式似乎更符合“OOD”,但从内存方面来看非常昂贵。
你认为哪种方式更好?有没有既符合OOD又便宜的更好的方法?
1个回答

3
如果您想制作一个更通用的数独求解器(还有其他形式),您可以使用以下内容: 单元格 - 在屏幕上具有位置 - 可以包含属于有限字母表的符号或为空。 - 属于一个或多个组。 - 一些单元格有固定值(不能更改)。 - 每次要更改单元格时,新值必须在所有组中有效。 通用组 - 包含若干个单元格,不超过字母表中符号的数量。 - 通用组有一个IsValid方法。 普通数独组 - 如果所有非空单元格包含不同的值,则IsValid方法返回true。 其他数独组 - (您可以定义自己的IsValid函数)。
注意:甚至可以混合不同类型的组。

1
请注意,Killer数独中的组可以包含重复的值。您可能需要引入一个单独的排除组概念(行、列和块将属于该组)。 - John Dvorak
1
感谢@Toon Krijthe给出了更通用的建议。那两个方面呢?面向对象设计和内存分配相比较,哪一个在这里更重要? - qwerty
1
主要关注应该是良好的设计。如果资源或性能成为问题,您可以随时稍后进行改进。但是对于数独求解器,所需的内存量很小,因此不要期望出现任何问题。 - Toon Krijthe
1
@user1961083 这取决于目标环境。单个对象很便宜,但一百万个不可垃圾回收的对象可能会非常昂贵。如果你的目标是一个只有4kB内存的嵌入式设备,那么一百个对象可能会成为问题。而桌面机则无需担心这个问题。 - John Dvorak
2
不幸的是,这取决于情况。有些面试官会先考虑设计,然后再优化,而其他人则会先关注优化。所以要遵循你的常识。 - Toon Krijthe
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接