其他分享
首页 > 其他分享> > 杭电oj HDOJ 2046 骨牌铺方格(递推)

杭电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