1*2瓷砖铺满足8*8地板

8*8地板,每层有256种状态,根据每种状态的互相转换,递推即可求解,下面是代码,可能会有错误,求大神指正~~

#include "stdafx.h"
#include <iostream>
using namespace std;

int sign[8]={0,3,6,12,24,48,96,192};
int val[128][128];
void init()
{
	memset(val,0,sizeof val);
	for(int i=0;i<128;i++)
	{
		for(int j=0;j<128;j++)
		{
			if(i|j==127)
				val[i][j]=1;
		}
	}
}
bool ResonableChar(long long c)
{
	for(int i=7;i>=0;i--)
	{
		if(c>=sign[i])
			c^=sign[i];
	}
	if(c==0)
		return true;
	else
		return false;
}

bool CanTrans(int a,int b)
{
	int int1=255^a;
	if(((b-int1)==(b^int1))&&ResonableChar(b-int1))
	{
		return true;
	}
	else
		return false;
}

long long value[8][256];
void get()
{
	memset(value,0,sizeof value);
	for(int i=0;i<256;i++)
	{
		if(ResonableChar(i))
			value[0][i]=1;
	}
	for(int i=1;i<8;i++)
	{
		for(int j=0;j<256;j++)
		{
			if(value[i-1][j]>0)
			{
				for(int k=0;k<256;k++)
				{
					if(CanTrans(j,k))
						value[i][k]+=value[i-1][j];
				}
			}	
		}
	}
}

//int get()
//{
//	for(int i=0;i<10;i++)
//		memset(a[i],0,sizeof(long long)*256);
//
//}

int _tmain(int argc, _TCHAR* argv[])
{
    get();
	cout<<value[7][255]<<endl;

	system("pause");
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值