2013-05-05 2 views
6

나는 this programming problem을 해결하려고 노력했지만, 알아낼 수 없기 때문에 온라인 솔루션을 발견했습니다. 해당 솔루션 중 하나를 작동하는 이유하지만 난 정말 *SPOJ : M3TILE 솔루션 설명

작업이 얼마나 많은 방법으로 할 수있는 3 * n에서 계산하는 것입니다 (n >= 0, n은 만 입력) 사각형 완전히 2로 가득 .. 이해할 수 없다 1 도미노.

(빨간색 선 라이더 대표) :

Image

이 3 * 2 사각형이 가질 수있는 세 가지 조합이 있었다는 것을 나는 텍스트를 읽을 때 내가 먼저 종이에 그린, 그리고 내가 본 것을이었다 그리고 n이 홀수 인 경우 전체 사각형을 채울 방법이 없기 때문에 솔루션은 0입니다 (한 조각은 항상 도미노에 의해 밝혀지지 않습니다).

따라서 n이 짝수이면 솔루션은 3^n이고 n이 홀수이면 0이라고 생각했습니다. 나는 틀렸다.

나는 여기에 상대적으로 간단한 해결책을 발견 :

#include <iostream> 

using namespace std; 

int main() 
{ 
    int arr[31]; 

    arr[0]=1; 
    arr[1]=0; 
    arr[2]=3; 
    arr[3]=0; 

    for(int i = 4; i < 31; i++) { 
     arr[i] = arr[i-2] * 4 - arr[i-4]; //this is the only line i don't get 
    } 

    int n; 

    while(1) { 
     cin >> n; 

     if(n == -1) { 
      break; 
     } 

     cout << arr[n] << endl; 
    } 

    return 0; 
} 

왜이 작업을 수행을?!

답변

18

T(n)2×1 타일로 3×n 보드를 타일링 할 수있는 방법의 수입니다. 또한 2×1 타일로 제거 된 한 모서리의 3×n 보드를 타일링 할 수있는 방법의 수를 P(n)이라고합시다. n이 충분히 크다고 가정합니다 (>= 4).

그런 다음 왼쪽에서 바둑판 식 배열을 시작하는 방법 (또는 중요하지 않음)을 고려하십시오.

왼쪽 상단 모서리를 덮는 타일을 세로 또는 가로의 두 가지 방법으로 배치 할 수 있습니다. 당신이 수직 배치하면 왼쪽 하단 모서리를 덮고있는 타일 구성 타일에 P(n-1) 방법으로 나머지 부분을 잎

| 
== 

을주는 수평으로 배치해야합니다. 가로로 배치하는 경우 왼쪽 하단 모서리를 덮는 타일을 가로 또는 세로로 배치 할 수 있습니다. 당신이 수직으로 배치하는 경우, 이전과 같은 상황에 바로 반영, 당신은 수평으로 배치하면, 당신은 타일에 3×(n-2) 보드와 함께 당신을 떠날,

== 
== 
== 

그들 사이에 수평으로 타일을 배치해야합니다.

= 
| 

을주고 당신을 떠날 하나 제거 (이미 포함) 코너 (의는 왼쪽 상단을 가정하자), 당신이 수직으로 아래에 타일을 배치 할 수 있습니다와 3×(n-1) 보드를 고려 이제 따라서

T(n) = T(n-2) + 2*P(n-1)    (1) 

, 타일에 3×(n-2) 보드, 또는 당신은

= 
== 
== 

을주는 수평 아래에 두 개의 타일을 배치 할 수 있습니다 그리고 당신은 다른 타일 호를 배치 할 수 밖에 없다 rizontally 상단에, 당신을 떠날

3×(n-3) 보드 마이너스 코너
=== 
== 
== 

,

P(n-1) = T(n-2) + P(n-3) 

n 대신에 n-2(1)를 사용하여,

T(n) = T(n-2) + 2*(T(n-2) + P(n-3)) 
    = 3*T(n-2) + 2*P(n-3)       (2) 

을 추가하지만, 우리는 그것을 본다

,853,210

또는 (2)로 그 삽입

2*P(n-3) = T(n-2) - T(n-4) 

재발을

T(n) = 4*T(n-2) - T(n-4) 

q.e.d.을 수득

+0

니스 증거! 자세한 정보는 http://oeis.org/A001835 –

+0

@Daniel n = 0에 해당하는 기본 사례를 설명해 주시겠습니까? –

+0

@ AtulSingh n = 0 인 경우 셀이없는 보드가 있습니다. 타일을 칠하는 한 가지 방법이 있습니다. 타일을 쌓지 마십시오 (3 × 0 보드에 3,0 = 0 셀이 있으므로 0/(2 · 1) = 0/2 = 0 타일이 필요합니다). –

0

시작 왼쪽 당신은 내가 먼저 노란색 타일 빨간색 타일을 배치 모든 경우에 그림 에 표시됩니다에 결국 하위 문제의 다른 유형 및 녹색 에서 타일을 배치 마지막으로 타일이 배치됩니다.

X (N) =의 × (N-2) + 2 * F (N-1)의 경우에서 (a), (b), (c)

F (N) =의 X (N- 1) + f (n-2)를 구한다.

f (n)을 x (n)로 표현할 수 있습니다.

자세한 설명을위한 이미지에서 봐

Tiles Problem - Image

출처 : https://www.quora.com/Can-somebody-explain-solution-to-SPOJ-com-Problem-M3TILE