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);//互换颜色 } } | |