기본적으로 기사가 0-63을 포함하는 8x8 격자의 특정 위치에 도달하는 데 필요한 최소의 이동량을 찾아야합니다.Knight의 최소 이동량 디버그 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 :
출력 예 (종료 값이 대답 : SRC = 63, 이명 령 = 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 이명 령은 하드 런타임에 코딩되지 않습니다. 값은 매개 변수 값으로 대체됩니다. 값은 테스트 목적으로 하드 코딩됩니다.
코드에 문제가 쉽게 표시되지 않습니다. 예외를 제외하고는 입력을 읽지 않으므로 테스트 케이스가 무엇인지 "알 수 있습니까?" 귀하가받는 테스트 케이스와 귀하의 프로그램 사이의 상호 작용은 어떻습니까? –
런타임 중에 빈 메서드가 작성된 다른 프로그램에 코드를 넣습니다. 메서드는 매개 변수 내에 두 개의 값을 포함합니다. 그 값은 src와 dest입니다. 테스트하는 동안 매개 변수가 필요한 값을 제공하기 때문에 int src = 63 및 int dest = 39가 삭제됩니다. –
안녕하세요 @ BrandanDerby, 오류에 대한 소스가 설명하는 대체 메커니즘에있을 수 있습니까? 원하지 않는 동작을 보이는 프로그램이 아닌 프로그램에서 오류를 검색하는 것은 약간 어렵습니다. 테스트 할 때 보이는대로 프로그램을 게시 할 수 있습니다. –