您的位置:首页 > 编程语言

递归 编程题#1: 完美覆盖(Coursera 程序设计与算法 专项课程4 算法基础 郭炜、刘家瑛;Fibonacci数列)

2018-01-02 19:22 1086 查看
编程题#1: 完美覆盖

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

一张普通的国际象棋棋盘,它被分成 8 乘 8 (8 行 8 列) 的 64 个方格。设有形状一样的多米诺牌,每张牌恰好覆盖棋盘上相邻的两个方格,即一张多米诺牌是一张 1 行 2 列或者 2 行 1 列的牌。那么,是否能够把 32 张多米诺牌摆放到棋盘上,使得任何两张多米诺牌均不重叠,每张多米诺牌覆盖两个方格,并且棋盘上所有的方格都被覆盖住?我们把这样一种排列称为棋盘被多米诺牌完美覆盖。这是一个简单的排列问题,同学们能够很快构造出许多不同的完美覆盖。但是,计算不同的完美覆盖的总数就不是一件容易的事情了。不过,同学们 发挥自己的聪明才智,还是有可能做到的。

现在我们通过计算机编程对 3 乘 n 棋盘的不同的完美覆盖的总数进行计算。



任务

对 3 乘 n 棋盘的不同的完美覆盖的总数进行计算。

输入

一次输入可能包含多行,每一行分别给出不同的 n 值 ( 即 3 乘 n 棋盘的列数 )。当输入 -1 的时候结束。

n 的值最大不超过 30.

输出

针对每一行的 n 值,输出 3 乘 n 棋盘的不同的完美覆盖的总数。

样例输入

2
8
12
-1


样例输出

3
153
2131


程序解答:

#include <iostream>
using namespace std;

int horizontal(int n);
int vertical(int n);

int count(int n) {
if (n == 0) return 1;
if (n % 2) return 0;
return horizontal(n) + vertical(n);
}

int horizontal(int n) {
if (n == 0) return 1;
if (n == 1) return 0;
return 2 * vertical(n - 1) + horizontal(n - 2);
}

int vertical(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
return horizontal(n - 1) + vertical(n - 2);
}

int main()
{
int n;
cin >> n;
while (n != -1) {
cout << count(n);
cin >> n;
if (n != -1) cout << endl;
}

return 0;
}

//理论依据,论文:http://www.cnblogs.com/drizzlecrj/archive/2008/12/23/1360670.html


本文转载自:https://www.cnblogs.com/dagon/p/4835908.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐