2016-01-10 10 views
6

JavaでのKnightツアーの問題を解決しようとしています。 私の目標は、どの次元のチェス盤でも馬のすべての可能なツアーを計算することです。私が使用しようとしているのは、補完リストデータ構造です。問題は今、どの四角形が四角形に隣接しているかを知っていることですが、隣接する四角形がどの方向を向いているのかわかりません。どうすればこの問題を解決できますか?隣接リストを含むKnightのツアーアルゴリズム

+0

は、あなたの隣接リストストア "法的ジャンプ" を行うか、彼らは "隣の広場" を記憶します?。そして、なぜあなたは道案内が必要なのですか?「正方形のID」だけを格納する方が簡単ではないでしょうか?第1四角は「0」です。 – tucuxi

+0

「法的なジャンプ」とはどういう意味ですか? – ShinyForce

+0

"法律上のジャンプ"はあなたのチェス盤で法的な騎士の動きになります。隣接関係リストを話すとき、ネットワークが思い浮かぶ。あなたはすべての四角を通して[ハミルトニアンパス](https://en.wikipedia.org/wiki/Hamiltonian_path_problem)を構築しようとしています。それは、騎士法律上の間でジャンプするときだけ四角形を接続してネットワークを再構成するのが理にかなっていますそれら。 – tucuxi

答えて

2

ここにあなたが何をすべきかのちょうど大まかな概要です:

  1. は、ダウン、アップのためのフィールドで「広場」クラスを作成し、左、右(プラスアクセサとモディファイ方法)
  2. メイク"Chessboard"クラスは、すべての四角形を格納し、それらを設定します。
  3. チェス盤の周りを移動する(そして移動が有効かどうかを確認する) "Knight"クラスを作成します。
  4. 最後に、ナイトを移動する方法を検索して保存するドライバクラスを作成します。

サンプルスクエアクラス:

public class Square 
{ 
    public final Square up; 
    public final Square down; 
    public final Square left; 
    public final Square right; 
    public Square(Square up, Square down, Square left, Square right) 
    { 
     this.up=up; 
     this.down=down; 
     this.left=left; 
     this.right=right; 
    } 
    public Square getUp(){return up;} 
    public Square getDown(){return down;} 
    public Square getLeft(){return left;} 
    public Square getRight(){return right;} 
} 

サンプル騎士クラス:

public class Knight 
{ 
    private Square mySquare; 

    public Knight(Square start) 
    { 
     mySquare = start; 
    } 

    /* 7 0 
    * 6 1 
    * 
    * 5 2 
    * 4 3 
    */ 
    public boolean move(int dir) 
    { 
     switch(dir) 
     { 
     case 0: try{ 
      mySquare=mySquare.getUp().getUp().getRight(); return true; 
     } catch (NullPointerException e) {return false} 
     case 1: try{ 
      mySquare=mySquare.getUp().getRight().getRight(); return true; 
     } catch (NullPointerException e) {return false} 
     case 2: try{ 
      mySquare=mySquare.getDown().getRight().getRight(); return true; 
     } catch (NullPointerException e) {return false} 
     case 3: try{ 
      mySquare=mySquare.getDown().getDown().getRight(); return true; 
     } catch (NullPointerException e) {return false} 
     case 7: try{ 
      mySquare=mySquare.getUp().getUp().getLeft(); return true; 
     } catch (NullPointerException e) {return false} 
     case 6: try{ 
      mySquare=mySquare.getUp().getLeft().getLeft(); return true; 
     } catch (NullPointerException e) {return false} 
     case 5: try{ 
      mySquare=mySquare.getDown().getLeft().getLeft(); return true; 
     } catch (NullPointerException e) {return false} 
     case 4: try{ 
      mySquare=mySquare.getDown().getDown().getLeft(); return true; 
     } catch (NullPointerException e) {return false} 
     default: return false; 
     } 
    } 
} 
関連する問題