我正在编写一个数独求解器,只是为了让自己重新养成使用Java的习惯,而且我遇到了很大的不便。
我正在尝试自己构建必要的类,所以我的攻击总体计划是创建一个Puzzle类,它由一组Row实例,一个Column实例数组和一个Sector实例数组组成。这些类中的每一个都包含一个引用该特定实例中的单元格的数组。在构建时,我计划让Puzzle类创建所有81个单元格,并将每个单元格分配给相应的行,列和扇区。我的问题有两方面:
首先,我如何设置它,使每个数组引用其中的单元格,这样我可以保持同步?只需分配它们就可以为每个类创建三个唯一的实例,这些实例必须手动同步。替代情况(唯一的单元格,每个单元格都引用了一个Row,Column或Sector类)将使得迭代行不可能。
其次,如何自动生成和分配单元格的过程?我想做一些动态的东西只是为了保存打字和代码空间 - 这就像这样:
private static final String[] letters{"A", "B", "C", "D", "E", "F", "G", "I"};
for (String letter : Puzzle.letters){
for (int i=1; i<10; i++){
Cell "letter+j" = new Cell();
"letter"[] = "letter+j";
"j"[] = "letter+j";
<Sector Calculation>
"sector"[] = "letter+j";
}
}
显然,这种事情不起作用,但写出81个结构和243个作业似乎是一个非常愚蠢的想法。
思想?
答案 0 :(得分:1)
我只是使用二维整数数组(在本例中为int[9][9]
)作为数据源 - 然后考虑哪些索引指示行,列或扇区。 oo-approach在这里没有意义,它只是索引映射数学,你将不得不这样做。
问自己的问题:Cell
除了封装整数之外还有什么做的吗? Row
/ Column
/ Sector
除了列出9个单元格之外还做了什么吗?
答案 1 :(得分:0)
以下是我如何设置它(最近在某些方面为类似Sudoku的拼图做了这个):
创建一个PuzzleSquare类。每个方块都知道它的坐标,并且引用了左边,右边,顶部和底部的方块。
创建一个PuzzleGrid类。该类具有(除其他之外)一个二维阵列,该阵列将每个正方形保持在它们相应的坐标中,例如, PuzzleGrid.grid [0] [0]是左下角的PuzzleSquare。
这允许您“逻辑地”遍历行和列 - 通过引用PuzzleSquare开始,并调用getLeft(),getRight()等 - 或者直接引用PuzzleGrid中的坐标。这似乎是冗余,在某种程度上它是,但我发现有时候让一个拼图方检查它的本地邻居而不是根据全局坐标来引用它们会更方便。
你的第二个问题,编程生成应该是一个简单的问题,因为你可以根据全局坐标迭代整个网格。
如果所有使用方块都是简单的数字存储,那就太过分了,但你可能会发现(正如我所做的)方块中有逻辑是有意义的,例如知道它们的当前值是有效的等等。