用户工具

站点工具


2020-2021:teams:wangzai_milk:weekly:poj_2411

POJ 2411

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
int h,w;
long long f[12][(1<<12)];
int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
int main()
{
	h=read(),w=read();
	while(h&&w)
	{
		if((h*w)%2){puts("0"),h=read(),w=read();continue;}
		memset(f,0,sizeof(f));
		if(!h&&!w)break;
		for(int i=1;i<=h;i++)
		{
			for(int j=0;j<(1<<w);j++)
			{
				if(i==1)
				{
					f[i][j]=1;
					for(int l=1;l<(1<<w);l<<=1)
					{
						if((j&l)==0)
						{
							if((l<<1)>=(1<<w)){f[i][j]=0;break;}
							else if(j&(l<<1)){f[i][j]=0;break;}
							else l<<=1;
						}
					}
				}
				else
				{
					for(int k=0;k<(1<<w);k++)
					{
						if(!f[i-1][k])continue;
						f[i][j]+=f[i-1][k];
						for(int l=1;l<(1<<w);l<<=1)
						{
							if(k&l)
							{
								if(j&l){f[i][j]-=f[i-1][k];break;}
							}
							else if((j&l)==0)
							{
								if((l<<1)>=(1<<w)){f[i][j]-=f[i-1][k];break;}
								else if(j&(l<<1)){f[i][j]-=f[i-1][k];break;}
								else if(k&(l<<1)){f[i][j]-=f[i-1][k];break;}
								else l<<=1;
							}
						}
					}
				}
			}
		}
		printf("%lld\n",f[h][0]);
		h=read(),w=read();
	}
	return 0;
}
2020-2021/teams/wangzai_milk/weekly/poj_2411.txt · 最后更改: 2020/05/10 01:33 由 zars19