/* ------------------------------------------------------------------------------ Find a tiling for my bathroom floor. By Bob Jenkins, 1998. Public Domain. ------------------------------------------------------------------------------ */ void driver() { int i; int a[36],b[4]; int c[36] = {5,6,8,11,14,17, 0,7,10,13,16,19, 1,9,12,15,18,4, 2,25,24,35,34,23,33,32,22,31,30,21,29,28,20,27,26,3}; /* check no color touches any other color */ for (a[0]=0; a[0]<1; ++a[0]) { for (a[1]=1; a[1]<2; ++a[1]) { for (a[2]=2; a[2]<3; ++a[2]) { for (a[3]=3; a[3]<4; ++a[3]) { for (a[4]=0; a[4]<4; ++a[4]) { if (a[4]==a[0] || a[4]==a[3]) continue; for (a[5]=0; a[5]<4; ++a[5]) { if (a[5]==a[0] || a[5]==a[4]) continue; for (a[6]=0; a[6]<4; ++a[6]) { if (a[6]==a[0] || a[6]==a[1] || a[6]==a[5]) continue; for (a[7]=0; a[7]<4; ++a[7]) { if (a[7]==a[1] || a[7]==a[6]) continue; for (a[8]=0; a[8]<4; ++a[8]) { if (a[8]==a[6] || a[8]==a[7]) continue; for (a[9]=0; a[9]<4; ++a[9]) { if (a[9]==a[7] || a[9]==a[8]) continue; for (a[10]=0; a[10]<4; ++a[10]) { if (a[10]==a[9] || a[10]==a[8]) continue; if (a[10]==a[1]) continue; for (a[11]=0; a[11]<4; ++a[11]) { if (a[11]==a[8] || a[11]==a[10]) continue; for (a[12]=0; a[12]<4; ++a[12]) { if (a[12]==a[10] || a[12]==a[11]) continue; for (a[13]=0; a[13]<4; ++a[13]) { if (a[13]==a[11] || a[13]==a[12]) continue; for (a[14]=0; a[14]<4; ++a[14]) { if (a[14]==a[11] || a[14]==a[13]) continue; for (a[15]=0; a[15]<4; ++a[15]) { if (a[15]==a[13] || a[15]==a[14]) continue; if (a[15]==a[9]) continue; for (a[16]=0; a[16]<4; ++a[16]) { if (a[16]==a[14] || a[16]==a[15]) continue; if (a[16]==a[4]) continue; for (a[17]=0; a[17]<4; ++a[17]) { if (a[17]==a[5] || a[17]==a[14] || a[17]==a[16]) continue; for (a[18]=0; a[18]<4; ++a[18]) { if (a[18]==a[17] || a[18]==a[16]) continue; if (a[18]==a[12] || a[18]==a[1]) continue; for (a[19]=0; a[19]<4; ++a[19]) { if (a[19]==a[4] || a[19]==a[5] || a[19]==a[17] || a[19]==a[18]) continue; for (a[20]=0; a[20]<4; ++a[20]) { if (a[20]==a[4] || a[20]==a[19] || a[20]==a[18]) continue; for (a[21]=0; a[21]<4; ++a[21]) { if (a[21]==a[16] || a[21]==a[18] || a[21]==a[15]) continue; for (a[22]=0; a[22]<4; ++a[22]) { if (a[22]==a[12] || a[22]==a[13] || a[22]==a[15]) continue; for (a[23]=0; a[23]<4; ++a[23]) { if (a[23]==a[9] || a[23]==a[10] || a[23]==a[12]) continue; for (a[24]=0; a[24]<4; ++a[24]) { if (a[24]==a[1] || a[24]==a[7] || a[24]==a[9]) continue; for (a[25]=0; a[25]<4; ++a[25]) { if (a[25]==a[1] || a[25]==a[2] || a[25]==a[7] || a[25]==a[24]) continue; for (a[26]=0; a[26]<4; ++a[26]) { if (a[26]==a[0] || a[26]==a[3] || a[26]==a[4]) continue; for (a[27]=0; a[27]<4; ++a[27]) { if (a[27]==a[26] || a[27]==a[4] || a[27]==a[19] || a[27]==a[20]) continue; for (a[28]=0; a[28]<4; ++a[28]) { if (a[28]==a[20] || a[28]==a[19] || a[28]==a[18]) continue; for (a[29]=0; a[29]<4; ++a[29]) { if (a[29]==a[28] || a[29]==a[18] || a[29]==a[16] || a[29]==a[21]) continue; for (a[30]=0; a[30]<4; ++a[30]) { if (a[30]==a[21] || a[30]==a[16] || a[30]==a[15]) continue; for (a[31]=0; a[31]<4; ++a[31]) { if (a[31]==a[30] || a[31]==a[15] || a[31]==a[13] || a[31]==a[22]) continue; for (a[32]=0; a[32]<4; ++a[32]) { if (a[32]==a[22] || a[32]==a[13] || a[32]==a[12]) continue; for (a[33]=0; a[33]<4; ++a[33]) { if (a[33]==a[32] || a[33]==a[12] || a[33]==a[10] || a[33]==a[23]) continue; for (a[34]=0; a[34]<4; ++a[34]) { if (a[34]==a[23] || a[34]==a[10] || a[34]==a[9]) continue; for (a[35]=0; a[35]<4; ++a[35]) { if (a[35]==a[34] || a[35]==a[9] || a[35]==a[7] || a[35]==a[24]) continue; /* check there are a roughly equal number of outer colors */ for (i=0; i<4; ++i) b[i]=0; b[a[2]]++; b[a[3]]++; for (i=20; i<36; ++i) b[a[i]]++ ; if (b[0]<3 || b[1]<3 || b[2]<3 || b[3]<3) continue; if (!((b[0]==b[2] && b[1]==b[3]) || (b[0]==b[3] && b[1]==b[2]))) continue; printf("%d%d%d%d ", b[0],b[1],b[2],b[3]); for (i=0; i<36; ++i) { if (i==6 || i==12 || i==18) printf(" "); printf("%d", a[c[i]]); } printf("\n"); }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} } int main() { driver(); return 1; }