【问题标题】:Java datatype for sudoku grid数独网格的 Java 数据类型
【发布时间】:2015-01-10 21:22:18
【问题描述】:

我目前正在尝试用 Java 计划/编写数独求解器。 目标是让我尽可能多地学习该语言(作为初学者)。

求解器将不是“蛮力”求解器,而是一个执行逻辑算法的函数系统,能够由人类完成。

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

  • ArrayList 的 ArrayList
  • 二维数组
  • 别的东西

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

哪种数据类型提供最佳的 2D 迭代?

【问题讨论】:

  • 如果你想避免嵌套的for循环,你可以试试一维数组。
  • 对于数独、井字游戏等类型的游戏,二维数组始终是您的最佳选择(更像更简单)。在 C++ 中它甚至更酷,因为内存块可以连续分配。

标签: java sudoku


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我建议基于二维数组编写您自己的数据类型。您可以实现“迭代”或“返回所有单元格”之类的方法,以避免重复嵌套的 for 循环并仍然访问所有元素。

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

      还有一点为什么应该使用二维数组:
      使用二维数组返回/检查/求解列或行非常容易,因为行和列在数独网格上共享一个公共索引(它们在二维数组中也是如此)。

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

      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;
          }
          //(...)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2019-11-12
        相关资源
        最近更新 更多