骑士的最小移动量调试Java

时间:2016-12-25 22:47:25

标签: java shortest-path

基本上我需要找到一个骑士在8x8网格上达到某个位置所需的最小移动量,编号为0-63。

我已经交叉检查了我能想到的所有测试用例,并且每个测试用例都正是我正在寻找的。我使用了在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();
    }       
}
} 

O(1)模型我检查了我的答案:

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

请告诉我我错过了什么。谢谢!

编辑:

int src&amp; int dest在运行时不会被硬编码。值将替换为参数值。这些值是硬编码的,用于测试目的。

2 个答案:

答案 0 :(得分:2)

我担心你的节目每次打印3次。这是因为您将源代码硬编码为方形63而目标格式为方形30.巧合的是,两个测试用例的答案确实是3.这是一个合理的猜测。所以你通过了那两个而其余的都没有。

相反,您当然应该以您的作业指定的任何方式阅读输入。

答案 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.为头脑风暴解决方案!我想只需要一些时间远离问题和一些想法。