POJ 2663 Tri Tiling 完美覆蓋

2021-07-24 13:38:01 字數 2718 閱讀 5870

一張普通的西洋棋棋盤,它被分成 8 乘 8 (8 行 8 列) 的 64 個方格。設有形狀一樣的多公尺諾牌,每張牌恰好覆蓋棋盤上相鄰的兩個方格,即一張多公尺諾牌是一張 1 行 2 列或者 2 行 1 列的牌。那麼,是否能夠把 32 張多公尺諾牌擺放到棋盤上,使得任何兩張多公尺諾牌均不重疊,每張多公尺諾牌覆蓋兩個方格,並且棋盤上所有的方格都被覆蓋住?我們把這樣一種排列稱為棋盤被多公尺諾牌完美覆蓋。這是乙個簡單的排列問題,同學們能夠很快構造出許多不同的完美覆蓋。但是,計算不同的完美覆蓋的總數就不是一件容易的事情了。不過,同學們 發揮自己的聰明才智,還是有可能做到的。

現在我們通過計算機程式設計對 3 乘 n 棋盤的不同的完美覆蓋的總數進行計算。

一次輸入可能包含多行,每一行分別給出不同的 n 值 ( 即 3 乘 n 棋盤的列數 )。當輸入 -1 的時候結束。

n 的值最大不超過 30.

針對每一行的 n 值,輸出 3 乘 n 棋盤的不同的完美覆蓋的總數。

2

8 12

-1

3

153

2131

這道題需要我們找出n取不同值時相互之間的關係。

假設f(n)為列數為n時可完美覆蓋方案的總數。

首先n為奇數時格仔數就會不夠,是不可能填充成功的。

我們把 3 x n 的棋盤分為左、右兩部分,右邊為不可分割的棋盤,像下圖這樣:

比如按上圖所示分割,右邊為2列時有三種情況,所以f(n)=3*f(n-2)

分割線向左遞進,下個方案右側可以分割成4列,右邊區域不可分割的情況只有下面這種鋪設方案x2(上、下翻轉):

右邊為6列時:

以此類推可知遞推公式:

f(n)=3f(n-2)+2f(n-4)+2f(n-6)+...+2f(0)
用f(n)-f(n-2)簡化公式得到:

f

(n)=4f

(n-2)-f

(n-4)

#include 

#include

using

namespace

std;

int f[31];

int main()

int n;

while(cin >> n && n != -1)

return

0;}

此題的解法就是這樣,這是行數為3的情況,如果未定的話可以使用暴力搜尋的方式,不過經試驗下面這種搜尋方法poj會提示 time limit exceeded …

#include 

#include

#include

using

namespace

std;

#define max_y 3

bool mark[max_y][30];

//放置多公尺諾牌的方向,只需向右或向下搜尋

int to[2][2] = ,};

int slncount = 0;

int cell[max_y][30];

int cellindex = 0;

int cache[30];

void printsolutions(int endx, int endy)

else

}cout

<< endl;

}cout

<< endl << endl;

}//以當前起點向各方向搜尋鋪設多公尺諾牌直到終點

void search(int startx, int starty, int endx, int endy)

return;

}//選鋪設多公尺諾牌的方向

for (int i = 0; i < 2; i++)

}if (hasfoundnextpoint)

}if (!hasfoundnextpoint)

//回溯,這兩個位置從未走過

mark[starty][startx] = false;

mark[nowy][nowx] = false;

cell[starty][startx] = cell[nowy][nowx] = --cellindex;}}

}int main()

slncount = 0;

if (cache[n] != -1)

else

if (n > 1)

else

if (n == 0)

if (n == 1)

cout

<< slncount << endl;

cache[n] = slncount;

cin >> n;

}return

0;}

POJ2663 完美覆蓋

描述 一張普通的西洋棋棋盤,它被分成 8 乘 8 8 行 8 列 的 64 個方格。設有形狀一樣的多公尺諾牌,每張牌恰好覆蓋棋盤上相鄰的兩個方格,即一張多公尺諾牌是一張 1 行 2 列或者 2 行 1 列的牌。那麼,是否能夠把 32 張多公尺諾牌擺放到棋盤上,使得任何兩張多公尺諾牌均不重疊,每張多公...

POJ 2663 完美覆蓋問題

此題是北大演算法課的遞迴作業。想了半天也找不出遞推公式。網上的文章都是直接給出結論,而沒有推導過程,無異於耍流氓。繼續尋找,直到看到此文才終於明白。首先,列數n肯定要是偶數,因為n 3 2得是整數。然後我們來想遞推公式。因為n是偶數,所以n 1,n 3這種奇數列,必然無法完全覆蓋。我們不考慮。首先,...

P2663 越越的組隊

原題鏈結 很容易看出來是個揹包問題嘛 體積是總分的一半,求最高分,每個同學選或不選,是個 01揹包問題。自信地交上去之後發現只有 90pts 為什麼呢?是不是忘了個條件啊喂,人家還要選 n 2 個人吶!多乙個條件就加乙個維度。zhx 有了第二個限制 重量是 n 2 這樣就從乙個 01揹包問題轉化成了...