4

私は2次元配列を持っていると答えました。

そして、私は3つの機能を持っています

  • 水平状態を確認するためのものです。
  • 垂直状態をチェックする別の機能
  • もう 1 つは 3*3 ブロックの状態をチェックします。

しかし、彼は満足していません。この質問に適切な答えを出せる人はいますか?

私の質問に関連するこのスタック オーバーフロー リンクを見つけました。 プログラミング設計のヘルプ - Sudoku Solver プログラムを構築する方法は? .

しかし、インタビュアーが私に期待するのと同じものである、適切なオブジェクト指向設計 (クラス、継承、その他の詳細など) が必要です。

4

6 に答える 6

5

私にとって、あなたのデザインは「地域」クラスから始まります。これを拡張して、「横の領域」「縦の領域」「正方形の領域」の3種類の領域にすることができます。編集:さらに検討すると、表示目的でない限り、この区別を実際に行う必要はありません...アルゴリズム的には同じになります。

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

于 2011-11-11T19:07:22.327 に答える
2

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

彼が何を構築してほしいかを理解するまでは、実際にソリューションを設計することはできません。

于 2014-04-29T17:20:09.823 に答える
2

ソルバーの基本クラスについてはCell、 、ValidationRegionBoard、およびPatternをメイン クラスとして使用するとよいでしょう。

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

ValidationRegion: の適切な 9 への参照がありCellsますBoard。このクラスは、規則が同じであるため、水平、垂直、または正方形の領域を表しているかどうかを実際に知る必要はありません。このクラスには、リージョンの現在の状態が可能であることを確認するための validate() メソッドがあります。

Board: の全体のレイアウトを持ち、参照によって適切なを渡すことによりCells、固定を適切に初期化します。また、ソリューションに到達するか、ソリューションが不可能であると判断されるまで、事前に定義された順序で適用されるメソッドもあります (したがって、ブルート フォース パターンは最後の努力である必要があります)。ValidationRegionsCellssolvePatterns

Patternapply(Board):指定されたパターンを指定されたボード オブジェクトに適用するメソッドを持つ抽象クラス(可能性Cellsが 1 つしか残っていないことがわかっている場合は、可能性を削除して設定します)。Sudoku Dragon - Sudoku StrategyからOneChoicePatternSinglePossibilityPatternOnlySquareRule、 などのパターンを実装する可能性があります。

于 2011-11-11T19:36:58.613 に答える
0

これについてはよくわかりませんが、インタビュアーはおそらくMVCパターンなど、高レベルの設計/アーキテクチャを望んでいたのではないかと感じています。次に、このコンテキスト内に、モデル、ビュー、およびコントローラーの 3 つのモジュール/コンポーネントがあります。次に、それぞれが 1 つ以上のクラスで構成されます。ほとんどの対話型アプリケーションでは、このパターンまたはいくつかのバリエーション/関連パターンが適用されます。

これで十分だったと言えます。面接では、クラスの詳細を考える時間がないため、そうする必要もありません (少なくとも一般的なケースでは)。

于 2011-12-10T01:48:48.490 に答える
0

数独へのオブジェクト指向アプローチの場合、次のようにします (単純な名前を使用するだけです)。

ANumberSpaceは Sudoku ボード上の 1 つの正方形で、1 ~ 9 の数字を保持できます。

Aは3x3 パターンBlockの 9 のグループであり、おそらくオブジェクトの多次元配列としてクラスで表されます。これに関するメソッドには、ブロックごとに番号が繰り返されていないことを確認するためにテストするものを含めることができます。NumberSpaceNumberSpace(bool)validate

最後に、aBoardはゲーム エリア全体を表し、これはBlocks の別の配列 (3x3) になります。このクラスのメソッドには、列/行の有効性を検証する手段が含まれます。

于 2011-11-11T19:10:29.590 に答える
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 ブロックを検討したい場合は、この問題に非常によく適合する複合設計パターンを選択できます。これは、 OOAD とデザイン パターンを使用して複雑なゲームを解決する、非常に興味深く実用的な本へのリンクです。

于 2011-11-11T19:30:38.293 に答える