2016-12-25 9 views
-1

基本的には、騎士が0から63までの8x8グリッド上の特定の位置に到達するのに必要な最小の移動量を見つける必要があります。騎士の最小移動量デバッグJava

私はすべてのテストケースがクロスチェックされており、すべてのテストケースが正確に私が探しているものです。私は、O(1)解法の後にモデル化された削除と配置アルゴリズムを代わりに使用しました。

私が問題のために受け取ったテストケースは機密であり、私が逃したものを推測するために残されています。コードを検証しようとすると、次の出力が表示されます。

テスト1が合格!
テスト2が失敗しました。
テスト3が合格!
テスト4が失敗しました。
テスト5が失敗しました。
テスト6が失敗しました。
テスト7が失敗しました。
テスト8が失敗しました。
テスト9が失敗しました。
テスト10が失敗しました。

コード:

public class Test { 

public static boolean found = false; 

public static void main (String[] args) { 

    int[][] arr = { // 0 1 2 3 4 5 6 7 
        { 0, 1, 2, 3, 4, 5, 6, 7}, // 0 
        { 8, 9, 10, 11, 12, 13, 14, 15}, // 1 
        {16, 17, 18, 19, 20, 21, 22, 23}, // 2 
        {24, 25, 26, 27, 28, 29, 30, 31}, // 3 
        {32, 33, 34, 35, 36, 37, 38, 39}, // 4 
        {40, 41, 42, 43, 44, 45, 46, 47}, // 5 
        {48, 49, 50, 51, 52, 53, 54, 55}, // 6 
        {56, 57, 58, 59, 60, 61, 62, 63}, // 7 
        }; 
    int src = 63; // Changed to parameters values later on in testing 
    int dest = 30; // Changed to parameters values later on in testing 

    int[] loc = pos(arr, src); 
    int[][] productMatrix; 
    int finalNumber = 0; 

    while(!found && arr[loc[0]][loc[1]] != dest) 
    { 
     productMatrix = createknights(arr, loc[0], loc[1], dest); 
     printMatrix(productMatrix); 
     System.out.println("--------------------"); 
     finalNumber++; 
    } 

    System.out.println(finalNumber); 


} 

public static int[][] createknights(int[][] arr, int r, int c, int goal) 
{ 
    arr[r][c] = -1; 
    int[][] knightLoc = getKnightLoc(arr); 

    for(int i = 0; i < knightLoc.length; i++) 
    { 
     int[][] possiblePositions = { 
             {knightLoc[i][0] - 2, knightLoc[i][1] - 1}, //Up Left 
             {knightLoc[i][0] - 2, knightLoc[i][1] + 1}, //Up Right 
             {knightLoc[i][0] + 2, knightLoc[i][1] - 1}, //Down Left 
             {knightLoc[i][0] + 2, knightLoc[i][1] + 1}, //Down Right 
             {knightLoc[i][0] - 1, knightLoc[i][1] - 2}, //Left Up 
             {knightLoc[i][0] + 1, knightLoc[i][1] - 2}, //Left Down 
             {knightLoc[i][0] - 1, knightLoc[i][1] + 2}, //Right Up 
             {knightLoc[i][0] + 1, knightLoc[i][1] + 2} //Right Down 
            }; 


     for(int[] row : possiblePositions) 
     { 
      if(checkLoc(arr, row[0], row[1])) 
      { 
       if(arr[row[0]][row[1]] == goal) 
       { 
        found = true; 
        break; 
       } 

       arr[row[0]][row[1]] = -1; 
      } 
     } 
    } 

    return arr; 
} 

public static int[][] getKnightLoc(int[][] arr) 
{ 
    int knightNum = getKnightNum(arr); 
    int[][] knightLocArray = new int[knightNum][2]; 

    for(int i = 0; i < arr.length; i ++) 
    { 
     for(int a = 0; a < arr[i].length; a++) 
     { 
      if(arr[i][a] == -1) 
      { 
       knightLocArray[(knightNum - 1)] = new int[]{i,a}; 
       knightNum--; 
      } 
     } 
    } 

    return knightLocArray; 
} 

public static int getKnightNum(int[][] arr) 
{ 
    int knightNum = 0; 

    for(int i = 0; i < arr.length; i ++) 
    { 
     for(int a = 0; a < arr[i].length; a++) 
     { 
      if(arr[i][a] == -1) 
      { 
       knightNum++; 
      } 
     } 
    }  

    return knightNum; 
} 

public static boolean checkLoc(int[][] arr, int r, int c) 
{ 
    if(r >= 0 && c >= 0 && r < arr.length && c < arr[r].length && arr[r][c] != -1) 
    { 
     return true; 
    } 

    return false; 
} 



public static int[] pos(int[][] arr, int src) 
{ 
    for(int i = 0; i < arr.length; i ++) 
    { 
     for(int a = 0; a < arr[i].length; a++) 
     { 
      if(arr[i][a] == src) 
      { 
       return new int[]{i , a}; 
      } 
     } 

    } 

    return null; 
} 

public static void printMatrix(int[][] arr) 
{ 
    for(int i = 0; i < arr.length; i ++) 
    { 
     for(int a = 0; a < arr[i].length; a++) 
     { 
      System.out.print(arr[i][a] + " "); 
     } 

     System.out.println(); 
    }  
} 
} 

モデル私は私の答えをチェックし(1)O:

O(1) model

出力例(終了値が答えです:SRC = 63、DEST = 30):

0 1 2 3 4 5 6 7 
8 9 10 11 12 13 14 15 
16 17 18 19 20 21 22 23 
24 25 26 27 28 29 30 31 
32 33 34 35 36 37 38 39 
40 41 42 43 44 45 -1 47 
48 49 50 51 52 -1 54 55 
56 57 58 59 60 61 62 -1 
-------------------- 
0 1 2 3 4 5 6 7 
8 9 10 11 12 13 14 15 
16 17 18 19 20 21 22 23 
24 25 26 27 28 -1 30 -1 
32 33 34 35 -1 37 -1 39 
40 41 42 -1 44 45 -1 -1 
48 49 50 51 -1 -1 54 55 
56 57 58 -1 60 -1 62 -1 
-------------------- 
0 1 2 3 4 5 6 7 
8 9 10 11 -1 13 -1 15 
16 17 18 -1 20 -1 22 -1 
24 25 -1 27 -1 -1 30 -1 
32 -1 34 -1 -1 -1 -1 -1 
40 41 -1 -1 -1 45 -1 -1 
48 -1 50 -1 -1 -1 54 -1 
56 57 -1 -1 -1 -1 -1 -1 
-------------------- 
3 <----Answer 

教えてください。 ng。ありがとう!

編集:

int型のSRC & int型のdestがハード、実行時にコード化されることはありません。値はパラメータ値に置き換えられます。値は、テスト目的のためにハードコードされています。

+0

私はあなたのコードに問題は見当たりません。それ以外は入力を読み取らないので、テストケースがどのように「知っていますか」?あなたが受け取ったテストケースとあなたのプログラムとの間の相互作用はどのようになっていますか? –

+0

実行時に、私は空のメソッドが書かれた別のプログラムに自分のコードを置きます。このメソッドには、パラメータ内に2つの値が含まれています。それらの値はsrcとdestです。テスト中、パラメータが必要な値を提供するため、int src = 63およびint dest = 39は削除されます。 –

+0

こんにちは@BrandanDerby、エラーの原因はあなたが説明している置換メカニズムですか?不要な動作を表示しているものではないプログラムでエラーを検索するのは少し難しいです(少なくともバージョンではない)。あなたはテストされているときに見えるようにプログラムを投稿したいかもしれません。 –

答えて

2

あなたのプログラムは毎回3回印刷されます。これは、ソースを正方形63で、宛先を正方形30としてハードコーディングしているためです。偶然、2つのテストケースへの回答は確かです3.これは合理的な推測です。だからあなたはその2つを渡し、残りは失敗します。

代わりに、あなたの割り当てで指定された方法で入力を読み込む必要があります。

+0

申し訳ありませんが、それはまったく起こっていません。私は、実行時テスト時にsrcとdestinationを必要なパラメータに変更します。私はそうでないと考えるのは馬鹿だ。 –

1

このコードブロックは、テストケースが1つのコードセクションでテストされていることを除いて、完璧な解決策です。

public static void main (String[] args) { 
    //Test Cases 
    System.out.println(answer(63,5)); 
    System.out.println(answer(19,4)); 
    System.out.println(answer(63,0)); 
} 

これは、プリントアウトします:私は、コードのこのセクション呼び出すために別々の方法が許さなっ例えば

、さらにデバッグ後

5 
0 
0 

は、私が引き起こしたものを見つけ先行ゼロは、コードの先頭にある変数を無視しています。したがって、完全に間違った答えにつながる。

前のコード:

while(!found && arr[loc[0]][loc[1]] != dest) 
{ 
    productMatrix = createknights(arr, loc[0], loc[1], dest); 
    printMatrix(productMatrix); 
    System.out.println("--------------------"); 
    finalNumber++; 
} 

System.out.println(finalNumber); 

新しいコード:

while(!found && arr[loc[0]][loc[1]] != dest) 
{ 
    productMatrix = createknights(arr, loc[0], loc[1], dest); 
    printMatrix(productMatrix); 
    System.out.println("--------------------"); 
    finalNumber++; 
} 

found = false; 

System.out.println(finalNumber); 

は、このように正しい答えを中継します。

ありがとうOle V.V.解決策をブレーンストーミングするために!私はちょうど問題といくつかのアイデアからいくつかの時間を必要と思う。

+0

あなたのソリューションを共有してくれてありがとう(私もあなたもそれを受け入れるかもしれないと思う)。 –

関連する問題