骨牌铺方格(C++实现)

目录

题目

题解 :  方法一

              方法二


题目

在2×n的一个长方形方格中,用一个1×2的骨牌铺满方格,输入n,输出铺放方案的总数。例如n=3时,骨牌的铺放方案有3种,如下图所示。

3832d7cb70174dec9657107b0aeda7bc.png

输入格式:

测试数据有多组,处理到文件尾。每组测试输入一个整数n(0<n≤50),表示长方形方格的规格是2×n。

输出格式:

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

题解

方法一:

分治思想,将问题拆分。假设有2×50规格的长方形方格,我们可以将其拆分成两个2×25的长方形方格……以此类推,方格就被拆分成了诺干个2×1及2×2规格的长方形方格。此时,我们可以写一个递归函数或者递推循环将各个方案数存入数组中。

因为作者递归很菜,所以这里给出的是递推循环将各个方案数的方法(逃跑[doge])

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[55]={};
int main(){
    int n;
    f[0]=0;
    f[1]=1;
    f[2]=2;
    //预存2*1规格及2*2规格的方案数
    for(int i=3;i<=50;i++){
        f[i]=f[i-1]+f[i-2];
    }
    //递推循环将n==i时的方案数存储起来
    while(cin>>n)//读取到文件尾
    {
        cout<<f[n]<<endl;
    }
	return 0;
}
方法二:

数学归纳法,找规律。经分析易得(bushi),n与铺放方案的总数有以下关系。

b8df7be6852043ee8a24273eaeed4e32.jpg

实现代码如下。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll cop(ll m,ll n){
    if(m==0){
        return 1;
    }
    ll ans=1;
    for(int i=n-m+1,j=1;i<=n;i++){
        ans*=i;
        if(i>=j&&j<=m){
        	ans/=j;
        	j++;
		}
    }
    return ans;
}//函数实现组合数的计算

int main(){
    int n;
    while(cin>>n){
        ll ans=0;
        for(int i=0,j=n;i<=j;i++,j--){
            ans+=cop(i,j);
        }
        cout<<ans<<endl;
    }
	 return 0;
}

欢迎大家在评论区留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值