有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;
}