编程之美:第四章 数字之趣 4.2瓷砖覆盖地板

/*
瓷砖覆盖地板:
原来的地板铺有N*M块正方形瓷砖,商店只提供长方形瓷砖,现在一块长方形瓷砖相当于于原来的两块正方形瓷砖,能否用1*2的瓷砖去覆盖N*M的地板呢

本质:
斐波那契递推数列公式
f(i) = f(i-1) + f(i-2)

分析:
N*M的地板有以下几种可能:
1如果N=1,M为偶数的话,显然1*2的瓷砖可以覆盖1*M的地板,需要M/2块瓷砖
2如果N*M为奇数,也就是N和M都为奇数,则肯定不能用1*2的瓷砖去覆盖它
证明:
假设能共用k快1*2的瓷砖去覆盖N*M的地板,因为瓷砖总面积为2k为偶数,而地板总面积为N*M为奇数,面积不符
3N和M中至少有一个为偶数,不放设M为偶数,既然可以用1*2的地板覆盖1*M的地板,就可以重复N次覆盖1*M的做法,必定可以覆盖N*M的做法

其实一定要按照数学思维,对各种情况加以分析

扩展问题:
1求用1*2的瓷砖覆盖2*M的地板有多少种方式?
参见斐波那契数列

输入:
1(N) 4(M)
3    7
3    8
4    8
输出:
Yes
No
Yes

*/

#include <stdio.h>

bool cover(int iRow,int iCol)
{
	if( ( (iRow * iCol) & 1 ) == 1 )//如果两个都是奇数,是不能覆盖的
	{
		return false;
	}
	else//如果长或者宽中至少有一个为偶数,就可以覆盖
	{
		return true;
	}
}

void process()
{
	int n,m;
	while(EOF != scanf("%d %d",&n,&m))
	{
		if(cover(n,m))
		{
			printf("Yes\n");
		}
		else
		{
			printf("No\n");
		}
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值