• POJ 算法基础 编程题#1: 完美覆盖


    编程题#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

    递归表达式想了很久没想出来,用了网上这个论文的http://www.cnblogs.com/drizzlecrj/archive/2008/12/23/1360670.html

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int horizontal(int n);
     5 int vertical(int n);
     6 
     7 int count(int n) {
     8     if (n == 0) return 1;
     9     if(n % 2) return 0;
    10     return horizontal(n)+vertical(n);
    11 }
    12 
    13 int horizontal(int n) {
    14     if (n == 0) return 1;
    15     if (n == 1) return 0;
    16     return 2 * vertical(n-1) + horizontal(n-2);
    17 }
    18 
    19 int vertical(int n) {
    20     if (n == 0) return 0;
    21     if (n == 1) return 1;
    22     return horizontal(n-1) + vertical(n-2);
    23 }
    24 
    25 int main()
    26 {
    27     int n;
    28     cin >> n;
    29     while (n != -1) {
    30         cout<<count(n);
    31         cin>>n;
    32         if (n != -1) cout<<endl;
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    P2515 [HAOI2010]软件安装
    P2502 [HAOI2006]旅行 最小生成树
    Luogu P2511 [HAOI2008]木棍分割 二分+DP
    P2303 [SDOI2012]Longge的问题 我傻QwQ
    P1129 [ZJOI2007]矩阵游戏 二分图匹配
    BZOJ3211花神游历各国
    [HNOI2011]XOR和路径
    NOIP考前划水
    [IOI2018]组合动作
    [NOIP2017]逛公园
  • 原文地址:https://www.cnblogs.com/dagon/p/4835908.html
Copyright © 2020-2023  润新知