17蓝桥杯决赛 磁砖样式

用dfs搜索回溯模拟铺砖块,按从左到右,从上到下铺,n表示铺第几块砖,然后取模转化为x,y表示坐标。 
初始化-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;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值