2011-11-11 10 views
2

これはインタビューの質問です。は、スコークのオブジェクト指向設計を与える

私は2dアレイを持っていると答えました。

次に、水平状態を確認する3つの機能があります。 垂直方向の状態を確認する別の機能。もう1つは3 * 3ブロック条件をチェックします。

しかし、彼は満足していないが、誰もこの質問に対して良い答えを与えることができます。

私の質問に関連するこのスタックオーバーフローリンクが見つかりました。 Programming Design Help - How to Structure a Sudoku Solver program?

しかし、私は面接者が私から期待したのと同じものである適切なオブジェクト指向の設計(クラス、継承、その他の詳細が必要なようなもの)が欲しいです。

ありがとうございました

答えて

4

私にとって、デザインは「地域」クラスから始まります。これを3つのタイプの領域として「水平領域」「垂直領域」「正方形領域」に拡張することができます。編集:それ以上の配慮をすると、表示目的でない限り、この区別をする必要はありません。アルゴリズム的には同じです。

次に、2次元配列の「要素」を作成し、その要素を地域に適切に追加すると、計算のためのネットワークが提供されます。要素には潜在的な値のリストがあり、地域によってはこれらの潜在的な値を削除する責任があります。値が見つかると、それはそのメンバーであるリージョンをトリガーして、それらから潜在的な値も除去します。

私は(単純な名前を使用して)このような何かをしたい数独へのオブジェクト指向のアプローチのために
0

NumberSpaceは、単一の数独ボード上の正方形と1-9からの番号を保持することが可能です。

Blockは、オブジェクトの多次元配列としてクラス内に表現されている3x3パターンで9 NumberSpaceのグループです。これに関するメソッドには、ブロックごとに何も繰り返されないことを確認するテストが行​​われる(bool)validateが含まれます。

最後に、Boardは、Blockの別の配列(3x3)になるゲーム領域全体を表します。このクラスのメソッドには、列/行の妥当性を検証する手段が含まれます。

0

この問題から2つの傑出したクラスが生まれ、メインゲームボードと値を保持しているセル。 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やデザインパターンに

2

を使用して複雑なゲームを解決するためのリンクですが、私はあなたの主なクラスとしてCellValidationRegionBoard、およびPatternで良いスタートを参照してください。

Cell:セルの現在の値、セルの残りの可能な値、およびセルが固定されているかどうかを保持します。

ValidationRegionBoardの該当する9 Cellsへの参照があります。このクラスは、ルールが同じであるため、水平、垂直、または正方形の領域を表すかどうかを実際に知る必要はありません。このクラスには、領域の現在の状態が可能であることを検証するvalidate()メソッドがあります。

Boardは:Cellsの全体のレイアウトを有しており、参照することにより適切なCellsを通過させることによって、適切に固定ValidationRegionsを初期化します。また、解決策が達成されるまで、または解決策が不可能であると判断されるまで、事前定義された順序でPatternsを適用するsolveメソッドがあります(ブルートフォースパターンが最後の溝の努力でなければなりません)。

Pattern:(Cellsからの可能性を除去し、それが左唯一可能性があることを知っている場合、それらを設定する)指定されたボードオブジェクトに与えられたパターンを適用する方法apply(Board)を有する抽象クラス。 Sudoku Dragon - Sudoku Strategyからは、おそらくなどOneChoicePatternSinglePossibilityPatternOnlySquareRule

0

のように私はこのことについてわからないが、私は面接はおそらくMVCパターンなど、ハイレベルの設計/のようなものを望んでいたことを感じているパターンを実装します建築。次に、このコンテキスト内で、3つのモジュール/コンポーネント(モデル、ビュー、コントローラ)があります。それぞれが1つ以上のクラスで構成されています。ほとんどのインタラクティブアプリケーションでは、このパターンまたはバリエーション/関連パターンが適用可能です。

これで十分だったと思います。面接では、授業の詳細を考え出す時間が足りないので、少なくとも(典型的な場合は)そうする必要はありません。

2

質問が「数独のオブジェクト指向設計とは何か」で、あなたが離れて話を始めたとき、実際の要件を求めなかったことに失望したかもしれません。 「数独」はかなり広いです。単なるデータ表現ですか?ソルバー?遊ぶ方法は?バリデーター?パズルクリエイター?

ビルドしたいことが分かるまで、実際にはソリューションを設計することはできません。

関連する問題