瓷砖样式

有2种不同颜色规格为1 * 2的瓷砖,用其来铺设地板,不能重叠和越界。并且,地板中任意2 * 2的格子不能为同一种颜色。如图,当地板为2 * 3时,有10种铺设方案。问:当地板为3 * 10时,问有多少种铺设方案
在这里插入图片描述
暴力dfs,要把每一种情况用二进制表示放入set来判重。搜索的时候不是直接给定坐标,而是给定瓷砖的编号,根据编号来算出瓷砖的坐标
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int color[10][50];
set<int>q;
void dfs(int cur)
{ 
	int x=cur/10;
	int y=cur%10;
	//printf("cur:%d x:%d y:%d col+1:%d\n",cur,x,y,color[x][y+1]);
    if(cur==29)
    {
       for(int i=0;i<9;i++)
       {
       if(color[0][i]==color[0][i+1]&&color[0][i]==color[1][i]&&color[0][i+1]==color[1][i+1])
       return ;
       if(color[1][i]==color[1][i+1]&&color[1][i]==color[2][i]&&color[1][i+1]==color[2][i+1])
	   return ;
	   }
	   int sum=0;
	   for(int i=0;i<3;i++)
	   for(int j=0;j<10;j++)
	   {
	   	if(color[i][j]==-1) return;
	   	sum=(sum<<1)+color[i][j];
	   }
       q.insert(sum);
	   return ;	
	}
	if(color[x][y]!=-1)
	{
		dfs(cur+1);
		return;
	}
	if(x<2&&color[x+1][y]==-1)//竖着放 
	{
		color[x][y]=color[x+1][y]=0;
		dfs(cur+1);
		color[x][y]=color[x+1][y]=1;
		dfs(cur+1);
		color[x][y]=color[x+1][y]=-1;
	}
	if(y<9&&color[x][y+1]==-1)//横着放  
	{
		color[x][y]=color[x][y+1]=0;
		dfs(cur+1);
		color[x][y]=color[x][y+1]=1;
		dfs(cur+1);
		color[x][y]=color[x][y+1]=-1;
	}
}
int main()
{
	memset(color,-1,sizeof(color));
	dfs(0);
	printf("%d\n",q.size());
	return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值