【发布时间】:2013-05-05 20:02:49
【问题描述】:
我一直在尝试解决this programming problem,但是由于我想不通,所以我在网上找到了解决方案。但我也无法真正理解为什么该解决方案也有效..
任务是计算一个 3*n(n >= 0,n 是唯一的输入)矩形有多少种方式可以完全用 2*1 多米诺骨牌填充。
例如(红线代表多米诺骨牌):
这是我在阅读课文时第一次在纸上画的,我看到 3*2 矩形可以有三种可能的组合,如果 n 是奇数,则解为 0,因为那么是没有办法填满整个矩形的(一块永远不会被多米诺骨牌覆盖)。
所以我认为解决方案只是3^n,如果 n 是偶数,0,如果 n 是奇数。原来,我错了。
我在这里找到了一个比较简单的解决方案:
#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;
}
为什么会这样?!
【问题讨论】:
标签: c++ algorithm math permutation