/*
瓷砖覆盖地板:
原来的地板铺有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;
}
编程之美:第四章 数字之趣 4.2瓷砖覆盖地板
最新推荐文章于 2018-03-11 17:28:36 发布