蓝桥杯2017 磁砖样式 brute force

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;

public class Main{
	static int gra[][] = new int[5][12];
	static Scanner sc = new Scanner(new BufferedInputStream(System.in));
	static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
	static int ans = 0;
	static int h = 3,w = 10;
	static HashSet<Long> set = new HashSet<Long>();
	static boolean check() {
		for(int i=0;i<3;i++) {
			for(int j=0;j<10;j++)
				if(i+1<3&&j+1<10)
					if((gra[i][j]+gra[i+1][j]+gra[i][j+1]+gra[i+1][j+1])%4==0)
					return false;
		}
		return true;
	}
	static void fill(int x,int y) {
		//out.println(x+" "+y);
		//sc.next();
		if(gra[x][y]==-1) {
			//横放
			if(y+1<10&&gra[x][y+1]==-1) {
				for(int i=0;i<2;i++) {
					gra[x][y] = gra[x][y+1] = i;
					if(y==9)fill(x+1,0);
					else fill(x,y+1);
					gra[x][y] = gra[x][y+1] = -1;
				}
			}
			if(x+1<3&&gra[x+1][y]==-1) {// 竖放
				for(int i=0;i<2;i++) {
					gra[x][y] = gra[x+1][y] = i;
					if(y==9)fill(x+1,0);
					else fill(x,y+1);
					gra[x][y] = gra[x+1][y] = -1;
				}
			}
		}
		else {
			if(x==2&&y==9) {
				if(check()) {
					int base = 1;
					long sum=0;
					for(int i=0;i<3;i++) {
						for(int j=0;j<10;j++) {
							sum += gra[i][j] * base;
							base*=2;
						}
					}
					if(!set.contains(sum)) {
						ans++;
						set.add(sum);
						out.println(sum);
					}					
				}
				return;
			}
			if(y==9)fill(x+1,0);
			else fill(x,y+1);
		}
	}
	public static void main(String[] args) {
		for(int i=0;i<3;i++)Arrays.fill(gra[i], -1);
		fill(0,0);
		out.println(ans);
		out.flush();
	}
}

标题:磁砖样式

小明家的一面装饰墙原来是 3*10 的小方格。
现在手头有一批刚好能盖住2个小方格的长方形瓷砖。
瓷砖只有两种颜色:黄色和橙色。
小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来。
小明有个小小的强迫症:忍受不了任何2*2的小格子是同一种颜色。
(瓷砖不能切割,不能重叠,也不能只铺一部分。另外,只考虑组合图案,请忽略瓷砖的拼缝)
显然,对于 2*3 个小格子来说,口算都可以知道:一共10种贴法,如【p1.png所示】
但对于 3*10 的格子呢?肯定是个不小的数目,请你利用计算机的威力算出该数字。

注意:你需要提交的是一个整数,不要填写任何多余的内容(比如:说明性文字)

样例


铺地砖 爆搜吧~!
枚举每一种情况 

还是按照深度搜索的方式去搜索 然后如果这里不是空地 就跳过 
最后hash去重一下 累计数量
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值