蓝桥杯 磁砖样式

import java.util.*;
public class cizhuanyangshi {
static int count=0;
static int sum=0;
//30个里选k个的选法
public static void p(int j,int a[],int d,int k) {
if(d>=k) {
if(t(a)==1) {
int ii=sum;
f(new int[a.length],a,0);
if(ii!=sum){
count++;
// for(int jj=0;jj<a.length;jj++) {
// System.out.print(a[jj]);
// if(jj==9||jj==19||jj==29) {
// System.out.println();
//
// }
//
// }
}
}
return ;
}
for(int i=j;i<a.length;i++) {
a[i]=1;
p(i+1,a,d+1,k);
a[i]=0;}
}

//深搜,满足条件的格子一定是成对出现的
public static void f(int uu[],int a[],int i) {
if(i==0) {

for(int jj=0;jj<a.length;jj++) {
uu[jj]=a[jj];
}
}
if(i==29) {
sum++;
return;}
if(a[i]!=3) {
if(i!=9&&i!=19)
if(a[i+1]==a[i]) {
int u=a[i];
a[i]=3;//深搜过的位置赋值为3
a[i+1]=3;
f(uu,a,i+1);
a[i]=u;//回溯
a[i+1]=u;

}

if(i+10<30)
if(a[i+10]==a[i]) {
int u=a[i];
a[i]=3;
a[i+10]=3;
f(uu,a,i+1);
a[i]=u;
a[i+10]=u;
}
}
else {f(uu,a,i+1);}
}
//判断条件
public static int t(int []a) {
//判断四个格子是一种颜色时不满足条件
for(int i=11;i<20;i++) {
if(a[i]==a[i-10]&&a[i]==a[i-11]&&a[i]==a[i-1]) {return 0;}
if(a[i]==a[i+10]&&a[i]==a[i+9]&&a[i]==a[i-1]) {return 0;}

}
//判断有单独出现(与上下左右颜色都不一样)的格子不满足条件
for(int i=0;i<a.length;i++) {
if(a[i]==1) {
int y=0;
if(i!=0&&i!=1&&i!=2&&i!=3&&i!=4&&i!=5&&i!=6&&i!=7&&i!=8&&i!=9) {
if(a[i-10]==0) {y++;}
}else {
y++;
}
if(i!=20&&i!=21&&i!=22&&i!=23&&i!=24&&i!=25&&i!=26&&i!=27&&i!=28&&i!=29) {
if(a[i+10]==0) {y++;}
}else {
y++;
}
if(i!=0&&i!=10&&i!=20) {
if(a[i-1]==0) {y++;}
}else {
y++;
}
if(i!=9&&i!=19&&i!=29) {
if(a[i+1]==0) {y++;}
}else {
y++;
}
if(y==4)return 0;
}}
return 1;
}

public static void main(String[] args) {

int a[]=new int[30];
//一种颜色的格子最少要有六个
//0和1各表示一种颜色
for(int i=6;i<15;i++) {
p(0,a,0,i);
}
System.out.println(count*2);//互换颜色
}

}

 
  
 

答案:101466

运行了大概16s

小白一个,如果有更好的建议欢迎留言

希望大佬们多多指点啊

点赞