面试问题:为Sudoku创建面向对象的设计

时间:2011-11-11 19:02:00

标签: java oop object-oriented-analysis 2d-games

我回答说我将有一个二维阵列。

然后我会有3个功能

  • 一个检查水平状况。
  • 检查垂直状况的另一个功能
  • 和另一个检查3 * 3阻止条件。

但是他不满意,任何人都能对这个问题给出一个好的答案吗?

我发现这个堆栈溢出链接与我的问题有关。 Programming Design Help - How to Structure a Sudoku Solver program?

但是我想要一个适当的面向对象设计(比如应该是类,继承和其他细节),这与访问者对我的预期相同。

6 个答案:

答案 0 :(得分:5)

对我而言,您的设计始于“地区”课程。然后,您可以将其扩展为“水平区域”“垂直区域”和“方形区域”作为三种类型的区域。编辑:经过进一步考虑,你不需要做出这种区分,除非它是出于显示目的......算法上它将是相同的。

然后,您可以制作2d“元素”数组,并将元素恰当地添加到您的区域,从而为您的计算提供网络。您的元素包含潜在值列表,您的区域负责删除这些潜在值。当您找到一个值时,它会触发它所属的区域,以从那些区域中删除潜在值。

答案 1 :(得分:2)

对于解算器的基类,我看到一个良好的开端,CellValidationRegionBoardPattern作为主要类。

Cell:具有单元格的当前值,单元格的剩余可能值以及单元格是否固定。

ValidationRegion:在Cells上引用了相应的9 Board。该类实际上不需要知道它是表示水平,垂直还是方形区域,因为规则是相同的。该类有一个validate()方法来验证该区域的当前状态是否可行。

Board:拥有Cells的整个布局,并通过引用相应的ValidationRegions来适当地初始化固定的Cells。它还有一个solve方法,以预先定义的顺序应用Patterns,直到达到解决方案或确定无法解决方案(因此蛮力模式必须是最后的努力)

Pattern:具有apply(Board)方法的抽象类,它将给定模式应用于指定的板对象(从Cells中删除可能性,并在知道只有一种可能性时设置它们剩下)。从Sudoku Dragon - Sudoku Strategy开始,您可能会实施OneChoicePatternSinglePossibilityPatternOnlySquareRule等模式。

答案 2 :(得分:2)

如果问题只是"什么是数独的面向对象设计"你走了之后开始告诉他什么,他可能会因为你没有要求实际要求而感到失望。 "数独"相当广泛。只是一个数据表示?求解器?玩的手段?验证器?拼图创作者?

直到你知道他想要你建立什么,你才能真正设计出一个解决方案。

答案 3 :(得分:0)

对于面向对象的Sudoku方法,我会做这样的事情(只使用简单的名字):

NumberSpace是数独棋盘上的一个方格,能够容纳1-9的数字。

Block是3个3x3模式中的9个NumberSpace的分组,它可能只是在类中表示为NumberSpace个对象的多维数组。这方面的方法可能包括(bool)validate,它会测试以确保每个块不重复任何数字。

最后,Board代表整个游戏区域,它将是Block s的另一个阵列(3x3)。此类的方法将包括验证列/行有效性的方法。

答案 4 :(得分:0)

这个问题引发了两个优秀的课程,即主游戏板和一个持有价值的单元格。

在C#中,这将是:

// Main game board
public class BoardGame{
   List<List<Cell> cells = new List<List<Cell>>();
   public BoardGame(int dimention){
      // Initialize and add cells to the cells attribute
   }
   public bool HorizLineContainsValue(int lineNumber, value){
      // return true if any cell in horiz. line number contains value
   }
   public bool VertLineContainsValue(int lineNumber, value){
      // return true if any cell in vertic. line number contains value
   }
}
public class Cell {
   // X index on the game board
   public int X{get; set;}
   // Y index on the game board
   public int Y{get; set;}
   // Value of this cell
   public int Value{get; set;}
   // Set game board 
   public GameBoard GameBoard{set;}
   public boolean AcceptValue(int value){
        // Ask the game board if cells on horizontal line X have this value
        // Ask the game board if cells on vertical line Y have this value
        // And return true or false accordingly
   }
}

如果您想考虑3 * 3块,那么您可以选择适合此问题的composite设计模式。 这是一个非常有趣和务实book使用OOAD和设计模式解决复杂游戏的链接

答案 5 :(得分:0)

我不确定这一点,但我觉得面试官可能想要像MVC模式等高级设计/架构。然后,在此上下文中,您将拥有三个模块/组件:模型,视图和控制器。然后每个由一个或多个类组成。对于大多数交互式应用程序,此模式或某些变体/相关模式适用。

我会说这已经足够了。因为在一次采访中你没有足够的时间来提出课程的细节,所以没有必要这样做(至少在典型情况下)。