2014-09-24 6 views
0

좋아요, 그래서 이것은 재미 있습니다. 저는 일본 체스 (쇼기라고도 함), 특히은 장군의 조각의 움직임을 코드화하려고합니다.게임 조각 운동 최적화; 특정 규칙이 주어지면 최소 움직임 수를 찾으십시오.

위치 (x, y)의 경우 조각은 (x-1, y + 1), (x, y + 1), (x + 1) 중 하나로 이동할 수 있습니다. , y + 1), (x-1, y-1) 또는 (x + 1, y-1) 다시 말해, 조각은 직접 대각선 또는 바로 위의 공간으로 이동할 수 있지만 왼쪽, 오른쪽 또는 아래로 직접 이동할 수 없습니다.

그래서 시작 위치 (sx, sy)와 최종 위치 (gx, gy)를 인수로 취해이 둘 사이의 가장 빠른 경로를 찾는 함수를 정의합니다. 시작과 끝 좌표가 수평선이나 수직선에 함께있는 경우에는 상황이 작동하는 것처럼 보일 수 있지만, 그 후에는 일이 멀어지기 시작합니다. 나는 조건을 놓치고 있는지, 또는 이것을 할 수있는 더 좋은 방법이 있는지 모르지만 함수는 주어진 인자로 작업해야한다. 아무도 올바른 방향으로 나를 가리킬 조언이 있습니까? 다음과 같이 내 코드는 다음과 같습니다

def minSteps(sx,sy,gx,gy): 
    count = 0 
    while [sx,sy] != [gx,gy]: 
     if (gy != sy and gx == sx): 
      if gy > sy: 
       sx = sx 
       sy += 1 
       count += 1 
      else: 
       sx += 1 
       sy -= 1 
       count += 1 
     elif (gy == sy and gx != sx): 
      if gx > sx: 
       sx += 1 
       sy += 1 
       count += 1 
      else: 
       sx -= 1 
       sy += 1 
      count += 1 
     elif (gy != sy and gx != sx): 
      if gy > sy: 
       if gx > sx: 
        sx += 1 
        sy += 1 
        count += 1 
       else: 
        sx -= 1 
        sy += 1 
        count += 1 
      if gy < sy: 
       if gx > sx: 
        sx += 1 
        sy -= 1 
        count += 1 
       else: 
        sx -= 1 
        sy -= 1 
        count += 1 
    return count 


답변

0

당신은 단계의 최소 개수에 대한 문제 공간을 검색 할 수있는 A* Search Algorithm을 시도 할 수 있습니다. 제한된 이동 옵션을 감안할 때 알고리즘은 장거리 이동 제한을 전문으로하기 위해 조정해야 할 수 있습니다.

희망이 도움이됩니다!

0

공간이 "무한"것으로 가정합니다. 그래서, 다양한 움직임이 방법 명명있어 :

  • A = (X + 1, Y + 1)
  • B = (X + 1, Y-1)
  • C = (X -1, Y-1)
  • D = (X-1, Y + 1)
  • E = (X, Y + 1)이 동작들의 순서는 중요하지 않기 때문에

, 경로를 찾는 대신, 얼마나 많은 As, 얼마나 많은 Bs 등을 계산하는 것을 선호합니다.

A, B, C 및 D 이동 만 고려하면 대각선으로 표시된 표가됩니다. 이 격자의 일부가 아닌 점은 E 이동을 사용하여 격자에 연결할 수 있습니다.

따라서, 1 단계 : 제로 모든 카운터 :

x = gx-sx; 
y = gy-sy; 

2 단계 : 시작 지점에 대하여, x 및 y를 찾는

a = 0; 
b = 0; 
c = 0; 
d = 0; 
e = 0; 

3 단계 : 점이 아닌 경우

if ((x&1)^(y&1)) {e=1; y--;} 

단계 4 : "그리드"는 전자의 이동을 사용하여, 그리드에 이동는 양수에 D 나 조작하기 쉽게 때문에

if (x<0) {hor=1; x=-x;} 
else hor=0; 
if (y<0) {ver=1; y=-y;} 
else ver=0; 

단계 5 : omain 숫자는 음수 인 경우에 반영되면 모든 숫자는 양이고, I는 B 및 카운터, 또는 D 및 카운터를 하나 발견

if (x>y) {b=(x-y)/2; a=y+b;} 
else {d=(y-x)/2; a=x+d;} 

6 단계 : 숫자가 반영된 경우 적절하게 카운터를 바꿔 넣으십시오 (오른쪽이 왼쪽으로 위로가 됨).

if (hor) {hor=a; a=d; d=hor; c=b; b=0;} 
if (ver) {ver=a; a=b; b=ver; ver=c; c=d; d=ver;} 

... 그게 전부입니다. 솔루션은 a, b, c, d, e 카운터에 있습니다. 경로가 실제로 필요한 경우 이동 카운터에서 경로를 파생시킬 수 있습니다.

최종주의 사항 : 변환 할 수 있기 때문에 카운터에 여러 가지 해결책이 있습니다. A + D = 2 E