蒙德里安的梦想
蒙德里安的梦想
如果横的放置确定了,那么纵向的肯定也确定了。所以只需要计算横着的方案数即可。
考虑使用
- 保证当前状态和上一列的状态的交集为空,为什么呢?如果这个状态某个位置有,那就说明这个位置的前一列延伸出一个长方形,同理前一列的前一列也延伸出一个,就重叠了。
- 二者的并集(就是第
列所有被占据的格子)中不能有连续奇数个 ,这比较好理解,如果有,那么就不能使用纵向小方格填补空白了。
#include<bits/stdc++.h>
using namespace std;
const int N=12;
int n,m;
long long f[N][1<<N];
bool st[1<<N];
int main(){
while(scanf("%d%d",&n,&m),n|m){
memset(f,0,sizeof f);
for(int i=0;i<1<<n;++i){
st[i]=1;
int cnt=0;
for(int j=0;j<n;++j)
if(i>>j&1){
if(cnt&1)st[i]=0;
cnt=0;
}
else ++cnt;
if(cnt&1)st[i]=0;
}
f[0][0]=1;
for(int i=1;i<=m;++i)
for(int j=0;j<1<<n;++j)
for(int k=0;k<1<<n;++k)
if(!(j&k)&&st[j|k])f[i][j]+=f[i-1][k];
printf("%lld\n",f[m][0]);
}
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17399472.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步