编程之美:第四章 数字之趣 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;
}

    原文作者:天地一扁舟
    原文地址: https://blog.csdn.net/qingyuanluofeng/article/details/47187829
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞