2013-12-17 7 views
2

이것은 그림이 없으면 설명하기가 다소 어려울 수 있지만, 왕이 확인되었는지 확인하는 과정에 있습니다. 그렇게하기 위해, 저는 왕의 위치에서 시작하여 왼쪽, 아래, 오른쪽, 모든 대각선 패턴으로갑니다.체스, 대각선으로 움직이는 마지막 위치를 찾는 알고리즘

코드를 단순화하기 위해 시작 위치와 끝 위치를 가져 와서 경로에 왕에게 위협이되는 경우 true를 반환하는 경로 검사기 메서드가 있습니다. 그래서, 내가 좋아하는이 메서드를 호출하고이 상단 행, 같은 열에 왕에서 확인 할

board.incheckPath(kingLocation, new Location(8, kingY))

. 왼쪽, 아래 및 오른쪽에 대해서도 비슷한 내용의 문장이 있습니다.

문제는 대각선 패턴에 대해 똑같은 방식을 사용하려고 시도하고 있으며 마지막 위치가 어디인지 파악하기위한 간단한 알고리즘을 이해할 수 없다는 것입니다. 만약 당신이 오른쪽보다 높으면, 당신이 오른쪽 위, 오른쪽으로 대각선으로 올라간다면 가장 오른쪽 칸을 누르기 전에 맨 윗줄을 칠 것입니다. 내가 그 위치에 대한 알고리즘을 알아 낸 것입니다 :

if x > y { row = 8; column = 8-(x-y) } else { row = 8-(x-y); column = 8; }

당신은 상단 행 또는 오른쪽 열 중 하나에서 멀리 x와 y 사이의 차이가 될 것입니다 착륙 어디 때문입니다. 그러나 나는 그 결과가 올라가고 내려갈 때, 왼쪽으로 내려갈 때, 아래로 갈 때, 그리고 오른쪽으로 갈 때 그 결과가 무엇인지 알 수 없다.

+0

"마지막"위치를 의미합니까? – cammil

+0

왼쪽에서 오른쪽으로, 왼쪽에서 아래로, 오른쪽에서 위로, 그리고 아래에서 아래로, 네가 갈 때 왕에게 대각선 방향으로 다가갑니다. 나는 이미 마지막 지점이 오른쪽 위로 움직일 때 무엇인지 알아 냈다. –

+0

마지막으로, 이사회를 떠나기 전에 마지막으로.따라서 위치 검사기가 위치 X에 도달 할 때까지 검사 할 방법을 알려줄 수 있습니다. –

답변

2

가정하면 좌표가

/|\ y 
|    col8 
+---+ ... +---+---+ 
| |  | | | <- row 8 
+---+ ... +---+---+ 
| |  | | | 
+---+ ... +---+---+ 
............... 
+---+ ... +---+---+ 
| |  | | | <- row 1 
+---+ ... +---+---+---> 
         x 

있는 솔루션을 확장 그것은 것입니다 외모 M Cliatt 2013 년, 수

// Up right 
if (y > x) { row = 8; column = 8-(y-x) } else { row = 8-(x-y); column = 8; } 

// Down left 
if (x > y) { row = 1; column = 1+(x-y) } else { row = 1+(y-x); column = 1; } 

// Up left 
if (9-x < y) { row = 8; column = x+y-8 } else { row = x+y-1; column = 1; } 

// Down right 
if (9-x > y) { row = 1; column = x+y-1 } else { row = x+y-8; column = 8; } 
+0

정말 고마워요. 그게 바로 제가 찾고 있던 것입니다. 당신이 당신의 답을 얻기 위해 어떤 논리를 사용했는지 설명해 주시겠습니까? –

+1

한 지점을 찍고 "마지막"위치를 찾는 예를 그렸습니다. 그런 다음 x 또는 y가 증가하면이 "마지막"위치가 어떻게 바뀌는 지 주목했습니다. 또한 증가하면 x 또는 y를 추가해야합니다. 감소하면 x 또는 y를 빼야합니다. 그런 다음 대각선을 보았습니다. 9-x = y 또는 x = y이고 -8 또는 +8 상수를 알아 냈습니다 ("오른쪽 아래"고려 : y = 9-x이면 행 = x + yC = x + 9-x) -C = 9-C = 1 = C = 8) –

2

난 당신이 다른 더 적절한 방법으로 경로를 정의하는 것이, 제안 :

int pathDeltas[][] = { 
    {1, 0}, {0, 1}, {-1, 0}, {0, -1}, // Up, down, left, right 
    {1, 1}, {-1, 1}, {1, -1}, {-1, -1}, // diagonal paths 
}; 

그런 다음 당신은 어떤 위치에서 시작하고 X에 델타를 추가하고 1 개 또는 8 값을 명중 할 때까지 Y 좌표 수 있습니다. 또한이 같은 기사 경로를 계산할 수 :

int knightDeltas[][] {{1, 2}, {2, 1}, {-1, 2}, {-2, 1}, 
        {1, -2}, {2, -1}, {-1, -2}, {-2, -1}}; 
+0

멋진 방법으로 보았을 때 생각하지 못했을 것입니다. 나는 이것을 구현할 가능성이 가장 높지만, 내 머리 속에 문제가 생겼으니이 사실을 알아 내고 싶다. 각 방향에 대해 가능한 마지막 위치를 얻는 간단한 알고리즘에 대한 아이디어가 있습니까? –

0

같은 (R, C) (여기서 R과 C는 [1..8]에 해당함)에 의해 정의 된 사각형에서 주교 대각선 스텝을 8x8 보드 벽에 부딪 힐 때까지 각 방향으로 잰다.

NE = Min(8 - R, 8 - C) 
NW = Min(8 - R, C - 1) 
SE = Min(R - 1, 8 - C) 
SW = Min(R - 1, C - 1) 

보드상의 한 순간의 반사는 대각선 (NE, SW 분할 방식) 및 반 대각선 (NW, SE)을 따라 이러한 분할을 보여줍니다. 대각선 8-R 분기 위의 NE는 항상 선택되고 대각선 이하에서는 8-C 분기가 항상 선택됩니다. 그것들은 대각선상에서 동일합니다. 컨텍스트에서 이것에 대해 생각 -

BTW (R, C) = (R + 8-R, C + 8-R)의 대각선 위의 사각형부터 NE 방향 광선

그래서 마지막 요소 주교 법적 이동 방해물 (현재) ... 문제가 끝난 곳에 관심이 있습니다.