用dfs搜索回溯模拟铺砖块,按从左到右,从上到下铺,n表示铺第几块砖,然后取模转化为x,y表示坐标。
初始化-1,用1,0分别表示一种颜色,每个点要不铺1,要不铺0(必须铺砖的两个点都为-1),不能铺返回上个点,铺过了的直接到下一个点
最后判重(也可以在铺的时候判断,花的时间更少,因为是填空题就算了)
答案105760
刚开始想,初始化0,用1表示一种颜色,每个点可以横铺1,竖铺1,或者不铺三种情况,
剩下的就是另外一种颜色,最后结果乘以2.
结果发现样例都过不了,比如会出现
1 1 0
0 1 1 这种情况。
还有可以直接dfs坐标,不用n,
初始化-1,用1,0分别表示一种颜色,每个点要不铺1,要不铺0(必须铺砖的两个点都为-1),不能铺返回上个点,铺过了的直接到下一个点
最后判重(也可以在铺的时候判断,花的时间更少,因为是填空题就算了)
答案105760
刚开始想,初始化0,用1表示一种颜色,每个点可以横铺1,竖铺1,或者不铺三种情况,
剩下的就是另外一种颜色,最后结果乘以2.
结果发现样例都过不了,比如会出现
1 1 0
0 1 1 这种情况。
还有可以直接dfs坐标,不用n,
从dfs(1,1)开始,到下一个点的时候调用dfs(x+y/10,y%10+1);
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans[32][32];
const int MOD = 10;
int Count=0;
void print(){
for(int i=0;i<3;i++){
for(int j=0;j<10;j++){
printf("%d ",ans[i][j]);
}
printf("\n");
}
printf("\n");
}
void dfs(int n)//搜索回溯
{ int x=n/MOD;
int y=n%MOD;
if(n==29)//铺到最后一块
{
for(int i=0;i<2;i++)
for(int j=0;j<9;j++)
{
int k=ans[i][j]+ans[i][j+1]+ans[i+1][j]+ans[i+1][j+1];
if(k==0||k==4)
return;
}
Count++;
// print();
return;
}
if(ans[x][y]!=-1) dfs(n+1);//铺过了
else
{
if(ans[x][y+1]==-1&&y!=9)//如果可以横着铺1,两块砖都为-1才能铺
{
ans[x][y]=1;ans[x][y+1]=1;
dfs(n+1);
ans[x][y]=-1;ans[x][y+1]=-1;
}
if(ans[x+1][y]==-1&&x!=2)//如果可以竖着铺1
{
ans[x][y]=1;ans[x+1][y]=1;
dfs(n+1);
ans[x][y]=-1;ans[x+1][y]=-1;
}
if(ans[x][y+1]==-1&&y!=9)//如果可以横着铺0
{
ans[x][y]=0;ans[x][y+1]=0;
dfs(n+1);
ans[x][y]=-1;ans[x][y+1]=-1;
}
if(ans[x+1][y]==-1&&x!=2)//如果可以竖着铺0
{
ans[x][y]=0;ans[x+1][y]=0;
dfs(n+1);
ans[x][y]=-1;ans[x+1][y]=-1;
}
}
}
int main()
{
memset(ans,-1,sizeof(ans));
dfs(0);
printf("%d",Count);
return 0;
}