poj2411 Mondriaan's Dream


poj2411 Mondriaan's Dream

題目描述

在n* m的方格中,用1* 2和2*1兩種塊把方格鋪滿有多少種鋪法

輸入輸出格式

輸入格式:

兩個整數,n,m。

輸出格式:

一個整數,表示方案數

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int n,m;
ll f[20][10010];
void dfs(int x,int y,int now,int nxt)
{
	if(x==n)
	{
		f[y+1][nxt]+=f[y][now];	
		return;								
	}
	if((now&(1<<x))==0)dfs(x+1,y,now,nxt|(1<<x));
	if(x+1<n&&((now&(1<<x))==0)&&((now&(1<<(x+1)))==0))dfs(x+2,y,now,nxt);
	if((now&(1<<x))>0)dfs(x+1,y,now,nxt);
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		if(n+m==0)break;
		if((n*m)&1){printf("0\n");continue;}
		if(m<n)swap(n,m);
		memset(f,0,sizeof(f));
		f[1][0]=1;
		for(int i=1;i<=m;++i)
			for(int j=0;j<(1<<n);++j)
				if(f[i][j]>0)dfs(0,i,j,0);
		printf("%lld\n",f[m+1][0]);
	}
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM