杭电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平台运行检查,如发现错误,欢迎指出和纠正,谢谢!