Java 数独网格的数据类型

Java datatype for sudoku grid

我目前正在尝试 plan/write Java 中的数独解算器。 目的是让我尽可能多地学习这门语言(作为初学者)。

求解器将不是 "brute-force" 求解器,而是一个实现逻辑算法的函数系统,能够由人类完成。

但是我使用哪种数据类型?

我知道在很多情况下它归结为偏好和功能,但是,因为我希望实现许多 "solve" 函数,所以我需要一个可以迭代的二维数据类型快速有效地避免重复代码(例如嵌套 for 循环)。

哪种数据类型提供最好的二维迭代?

二维数组可能是您的最佳选择,因为数独网格是固定的:

byte[][] grid = new byte[9][9];

它肯定会给您最好的 space 和计算性能(即使您在 9x9 的小网格上观察不到任何差异!)。

现在,如果您更习惯使用其他数据结构或想使用更面向对象的数据结构,那就去尝试并享受这门语言吧。

二维数组可能是最好的解决方案。数组列表的数组没有多大意义,因为 ArrayLists 被设计为动态大小,而这里不是这种情况。

我建议基于二维数组编写您自己的数据类型。您可以实现 "iterate" 或 "return all cells" 之类的方法来避免重复嵌套的 foor 循环并仍然访问所有元素。

如果您的字段大小未知或出于任何原因需要动态,则 ArrayLists 很有用,但由于数独游戏始终具有 9x9 网格,因此您不需要它,如果您刚刚开始学习 java,则应该坚持基础知识(在这种情况下,将 class 包裹在二维数组周围,这是一个很好的开始恕我直言)。

还有一点为什么你应该使用二维数组:
使用二维数组 return/check/solve 一列或一行非常容易,因为行和列在数独网格上共享一个公共索引(在二维数组中也是如此)。

这可能是您的起点。无非是一个小小的灵感。

class Sudokugrid{
    private int[][] field;
    Sudokugrid(){
       this.field = new int[9][9];
    }
    public int get_cell(int x, int y){
       return this.field[x][y];
    }
    public void set_cell(int x, int y; int value){
       this.field[x][y] = value;
    }
    //(...)
}