我回答说我将有一个二维阵列。
然后我会有3个功能
但是他不满意,任何人都能对这个问题给出一个好的答案吗?
我发现这个堆栈溢出链接与我的问题有关。 Programming Design Help - How to Structure a Sudoku Solver program?
但是我想要一个适当的面向对象设计(比如应该是类,继承和其他细节),这与访问者对我的预期相同。
答案 0 :(得分:5)
对我而言,您的设计始于“地区”课程。然后,您可以将其扩展为“水平区域”“垂直区域”和“方形区域”作为三种类型的区域。编辑:经过进一步考虑,你不需要做出这种区分,除非它是出于显示目的......算法上它将是相同的。
然后,您可以制作2d“元素”数组,并将元素恰当地添加到您的区域,从而为您的计算提供网络。您的元素包含潜在值列表,您的区域负责删除这些潜在值。当您找到一个值时,它会触发它所属的区域,以从那些区域中删除潜在值。
答案 1 :(得分:2)
对于解算器的基类,我看到一个良好的开端,Cell
,ValidationRegion
,Board
和Pattern
作为主要类。
Cell
:具有单元格的当前值,单元格的剩余可能值以及单元格是否固定。
ValidationRegion
:在Cells
上引用了相应的9 Board
。该类实际上不需要知道它是表示水平,垂直还是方形区域,因为规则是相同的。该类有一个validate()方法来验证该区域的当前状态是否可行。
Board
:拥有Cells
的整个布局,并通过引用相应的ValidationRegions
来适当地初始化固定的Cells
。它还有一个solve
方法,以预先定义的顺序应用Patterns
,直到达到解决方案或确定无法解决方案(因此蛮力模式必须是最后的努力)
Pattern
:具有apply(Board)
方法的抽象类,它将给定模式应用于指定的板对象(从Cells
中删除可能性,并在知道只有一种可能性时设置它们剩下)。从Sudoku Dragon - Sudoku Strategy开始,您可能会实施OneChoicePattern
,SinglePossibilityPattern
,OnlySquareRule
等模式。
答案 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模式等高级设计/架构。然后,在此上下文中,您将拥有三个模块/组件:模型,视图和控制器。然后每个由一个或多个类组成。对于大多数交互式应用程序,此模式或某些变体/相关模式适用。
我会说这已经足够了。因为在一次采访中你没有足够的时间来提出课程的细节,所以没有必要这样做(至少在典型情况下)。