一張普通的西洋棋棋盤,它被分成 8 乘 8 (8 行 8 列) 的 64 個方格。設有形狀一樣的多公尺諾牌,每張牌恰好覆蓋棋盤上相鄰的兩個方格,即一張多公尺諾牌是一張 1 行 2 列或者 2 行 1 列的牌。那麼,是否能夠把 32 張多公尺諾牌擺放到棋盤上,使得任何兩張多公尺諾牌均不重疊,每張多公尺諾牌覆蓋兩個方格,並且棋盤上所有的方格都被覆蓋住?我們把這樣一種排列稱為棋盤被多公尺諾牌完美覆蓋。這是乙個簡單的排列問題,同學們能夠很快構造出許多不同的完美覆蓋。但是,計算不同的完美覆蓋的總數就不是一件容易的事情了。不過,同學們 發揮自己的聰明才智,還是有可能做到的。
現在我們通過計算機程式設計對 3 乘 n 棋盤的不同的完美覆蓋的總數進行計算。
一次輸入可能包含多行,每一行分別給出不同的 n 值 ( 即 3 乘 n 棋盤的列數 )。當輸入 -1 的時候結束。
n 的值最大不超過 30.
針對每一行的 n 值,輸出 3 乘 n 棋盤的不同的完美覆蓋的總數。
28 12
-1
3這道題需要我們找出n取不同值時相互之間的關係。153
2131
假設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揹包問題轉化成了...