杭电oj HDOJ 2046 骨牌铺方格(递推)
作者:互联网
杭电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平台运行检查,如发现错误,欢迎指出和纠正,谢谢!
辽工大考杭电 发布了21 篇原创文章 · 获赞 3 · 访问量 401 私信 关注标签:2046,count,oj,杭电,铺放,方格,骨牌,递推,cout 来源: https://blog.csdn.net/qq_39880604/article/details/104554575