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去重一下 累计数量