2013-05-02 2 views
-2

시뮬레이션하기 위해 여기 데모의 이미지입니다. 사용자가 이들을 선택하면 그 위의 모든 블록이 삭제됩니다. 나는 이것을 사소한 복잡성으로 시뮬레이션하는 가장 좋은 방법을 찾고 싶다.가장 좋은 알고리즘은 블록 드롭

for (int i = 0; i < 8; i++) 
    for (int j = 0; j < 8; j++) { 
    if (currentBlock == blank) { 
     while((currentBlock.pos.x - 8) >= 0) { 
      aboveBlock = (currentBlock.pos.x - 8); 
      replace(currentBlock,aboveBlock); 
     } 
    } 

하지만 완벽한 알고리즘은 아닙니다. 누가 날 도울 수 있죠? 부디. 고맙습니다.

+0

관련 언어가 너무 많기 때문에 관련 언어를 추가하십시오. –

+0

@ Koushik 글쎄, 그는 일반적인 알고리즘을 찾고있다. 그는이를 자신이 선택한 언어로 쉽게 번역 할 수 있습니다. 대답이 이해할 수없는 언어를 사용하거나 자신의 개념이 자신의 언어를 선택하지 않으면 검색 범위를 좁힐 시간입니다. 그런데, 이것이 * C *인지 확실합니까? * C *는 루프 헤더에서 변수 선언을 허용합니까 (확실하지 않을 수도 있습니다)? –

+0

@ChristianRau 예 c99 이상에서는 그런 종류의 선언이 허용됩니다. 그리고 그 이유는 내가 그에게 그렇게 묻고 있었기 때문입니다 (그가 같은 언어로 보일지도 모른다고 생각한 것입니다). 잘 C + + 또한 (자바에 대해 잘 모르는) 경기이며 더 나은 솔루션을 얻을 수 있도록 그들 각각의 속임수가있을 수 있습니다 제안 왜 많은 사람들 이이 질문에 액세스 할 수있을 수도 있습니다. 하지만 당신은 그가 알고리즘을 요구하는 것이 옳습니다. 그가 필요 없다고 느낀다면 나는 태그를 제거 할 것이다. –

답변

0

제거 된 모든 블록의 위치를 ​​넘겨받을 수있는 경우 모든 경기장에서 반복적으로 피해야하는 위치를 찾을 수 있습니다.

또한 위쪽에 위치 할 때까지 자신을 호출하는 재귀 적 메서드를 구현할 수 있습니다.

//Called on an empty block 
Drop(int x, int y) { 
    if (y > 0) { 
     aboveBlock = (currentBlock.pos.x - 8) 
     replace(currentBlock,aboveBlock); 
     Drop(x,y-1); 
    } 
} 

그냥 가능한 한 적은 이동에

0

1) 낮은 수준의 접근 방식을 이동 플레이어에 의해 지워 맨 아래 possitions에 Drop() 전화?
하나의 읽기 포인터와 하나의 쓰기 포인터를 유지하십시오. 빈 요소가있는 경우에만 읽기에서 쓰기로 데이터를 이동하십시오. 필요한 경우 인덱스 [y] [x] vs [x] [y]의 순서를 반대로합니다.

Y = 0; // index for reading 
y = 0; // index for writing 
while (Y < height) { 
    if (block[x][Y] == blank) { Y++; continue; } 
    if (Y > y) block[x][y] = block[x][Y]; 
    Y++; y++; 
} 
// At this point the source ptr/index 'y' can lag behind -- clear the rest 
while (y < height) block[x][y++] = blank; 

1B)이 최소의 인덱스 삭제 블록의 'Y'를 추적 및/또는 uneffected 열을 스킵함으로써 약간 향상시킬 수있다.

2) 높은 수준의 접근 : qsort로 각 열을 정렬하십시오.

관련 문제