瓷砖覆盖问题

问题一:
某年夏天,位于希格玛大厦四层的微软亚洲研究院对办公楼的天井进行了一次大 规模的装修.原来的地板铺有 N×M 块正方形瓷砖,这些瓷砖都已经破损老化了,需要予以 更新.装修工人们在前往商店选购新的瓷砖时,发现商店目前只供应长方形的瓷砖,现在的 一块长方形瓷砖相当于原来的两块正方形瓷砖, 工人们拿不定主意该买多少了, 读者朋友们 请帮忙分析一下:能否用 1×2 的瓷砖去覆盖 N×M 的地板呢?
 
解:
首先N和M必须分别是1和2的整数倍,要不肯定不行;
想了想也没有其他条件了,这个简单
 
问题二:
用p*q的瓷砖能覆盖M*N的地板吗?
 
解:
①M*N必须是p*q的整数倍
②p和q中大数要小于等于M,N的大数,小数要小于等于M,N的小数
③如果p*q是偶数,那么M,N当中不是p,q倍数的边长,必须是p和q的某种*+运算组合;
  如果是奇数,那么只需要满足前两个条件即可;





#include<cstdio>
#include<cstring>
long   f[30][1<<12],i,j,n,m,saya=1;
void sayatime (int i,int s1,int pos)
{
    if (pos==m) {f[i][s1]+=saya;return;}
    sayatime(i,s1,pos+1);
    if (pos<=m-2&&!(s1&1<<pos)&&!(s1&1<<pos+1)) sayatime(i,s1|1<<pos|1<<pos+1,pos+2);
}
int main()
{
   
    while(scanf("%d%d",&n,&m),n!=0)
    {
    memset(f,0,sizeof(f));saya=1;
    sayatime(1,0,0);
    for (i=2;i<=n;i++)
    for (j=0;j<1<<m;j++)
    {
        if (f[i-1][j]) saya=f[i-1][j]; else continue;
        sayatime(i,~j&((1<<m)-1),0);
    }
    printf("%lld\n",f[n][(1<<m)-1]);
    }
}
》》》上述代码来自POJ,用1×2覆盖m×n的矩形(正方形)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值