当前位置: 代码迷 >> 综合 >> 杭电oj HDOJ 2046 骨牌铺方格(递推)
  详细解决方案

杭电oj HDOJ 2046 骨牌铺方格(递推)

热度:4   发布时间:2024-01-26 18:52:15.0

杭电oj HDOJ 2046 骨牌铺方格(递推)

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2046

Problem Description

在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:在这里插入图片描述

Input

输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0<n<=50)。

Output

对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。

解题思路

本题与前几题一样也是利用“递推”来求解。
我们可以统计n较小时的一些结果,来寻找递推公式。

表格中的第一行表示有几个牌是立着放的情况。第一列表示n的值。表格的内容则表示该种情况下有多少种铺牌方法。
在这里插入图片描述
从最后的“铺法数”可以看出n个牌的铺放方案数=n-1个牌的铺放方案数+n-2个牌的铺放方案数

本人的C++解决方案

/* 我的VS2019编译器使用“scanf”时会提示 “error C4996: 'scanf': This function or variable may be unsafe” 的错误,用下行的“定义”来解决这个错误提示! */
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
using namespace std;int main()
{int n, i;__int64 count[50];count[0] = 1;count[1] = 2;for (i = 2; i < 50; i++) {count[i] = count[i - 1] + count[i - 2];}/*不知道是什么原因,当我使用cin和cout,平台会提示编译出错,使用scanf和printf则会AC其他人对本题讲解也有使用cin和cout的,不知道他们出没出现我的这个问题。。。while (cin >> n) {cout << count[n - 1] << endl;}*/while (scanf("%d", &n) != EOF) {printf("%I64d\n", count[n - 1]);}return 0;
}

代码通过HDOJ平台运行检查,如发现错误,欢迎指出和纠正,谢谢!