记录编号 159463 评测结果 AAAAAAAAAA
题目名称 走道铺砖问题 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 1.757 s
提交时间 2015-04-21 16:29:55 内存使用 183.53 MiB
显示代码纯文本
#include <fstream>
#include <string.h>
using namespace std;
ifstream in("floor.in");
ofstream out("floor.out");
int p[21]={0},now=0;
const int base=100000000;
int m,n;
class HP
{
public:
	int n;
	int s[21];
	HP()
	{
		n=1;
		memset(s,0,sizeof(s));
	}
	void operator =(int x)
	{
		memset(s,0,sizeof(s));
		n=1;
		s[0]=x;
	}
	void operator +=(const HP &b)
	{
		int i;
		n=max(n,b.n)+1;
		for(i=0;i<n;i++)
		{
			s[i]+=b.s[i];
			s[i+1]+=s[i]/base;
			s[i]%=base;
		}
		while(n>1&&s[n-1]==0)n--;
	}
	void print()
	{
		int i;
		out<<s[n-1];
		for(i=n-2;i>=0;i--)
		{
			int we=8,studio=0,j;
			studio=s[i];
			while(studio)
			{
				studio/=10;
				we--;
			}
			for(j=1;j<=we;j++)out<<0;
			out<<s[i];
		}
	}
}f[41][13][1<<12];
void DFS(int n,int o,int s1,int s2)
{
	if(o>m)return ;
	f[n][o][s1]+=f[n-1][o][s2];
	DFS(n,o+1,s1*2,s2*2+1);
	DFS(n,o+1,s1*2+1,s2*2);
	DFS(n,o+2,s1*4+3,s2*4+3);
}
int main()
{
	int t,i,j;
	in>>n>>m;
	if(m>n)
	{
	   t=m;
	   m=n;
	   n=t;
	}
	for(i=1;i<=m;i++)f[0][i][(1<<i)-1]=1;
	for(i=1;i<=n;i++)DFS(i,0,0,0);
	f[n][m][(1<<m)-1].print();
	return 0;
}