#include<bits/stdc++.h> using namespace std; const int N=15,M=1<<N; int n,m; bool st[M]; long long f[N][M]; void init() { for(int i=0;i<1<<n;i++) { int cnt=0; st[i]=true; for(int j=0;j<n;j++) if(i>>j&1) { if(cnt&1)//如果cnt为奇数,则cnt&1==1 { st[i]=false; break; } } else cnt++; if(cnt&1)//如果最后一位是0,在上面的循环中无法判断,所以要在这里特判一下 st[i]=false; } } int main() { while(cin>>n>>m,n||m) { init(); memset(f,0,sizeof f); 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(st[j|k] && !(j&k)) f[i][j]+=f[i-1][k]; } } cout<<f[m][0]<<endl;//第m+1列,什么都摆 } return 0; }
标签:cnt,梦想,false,蒙德里安,int,st From: https://www.cnblogs.com/tolter/p/17154454.html