#include #include #include #define NR 486 int data_vec[NR] = { 442,697,1464,700,636,1148,1340,318,311,1337,504,380,249,1566,1333,1594,126, 693,573,633,187,189,63,571,438,250,252,1242,543,377,1805,825,686,1678,476, 1388,373,909,1235,729,1652,467,742,1167,474,1611,1266,378,1734,1351,603,630, 748,1587,1622,1880,374,746,1381,473,965,1626,873,1505,1478,629,462,427,461, 1625,1865,1638,1671,359,869,627,95,1338,683,881,1986,980,207,1205,1396,1621, 1876,190,1607,948,726,1834,972,1386,1705,1579,1814,1702,725,1708,1563,1369, 123,730,235,246,1904,1925,238,1714,429,1209,819,1929,437,1716,756,783,1968, 876,918,1596,1686,621,1748,1992,745,1752,591,559,1614,1295,854,1582,1960, 1896,807,1131,1145,882,814,1740,797,1115,1675,1737,715,732,1331,237,1445, 1227,907,1127,663,1334,1644,1325,1677,1195,1641,119,219,811,874,822,1768, 1450,1799,221,411,821,1382,619,921,1458,1813,1559,350,215,931,1421,1197, 798,1260,1258,1944,1830,1829,1926,739,159,1761,858,1833,1085,365,347,2016, 1642,1481,1254,366,1427,1303,1806,1198,1953,754,1379,917,1699,851,1738,1635, 1415,1862,222,413,1419,1873,1357,1393,1746,1844,606,685,414,978,1954,1745, 407,934,1133,1182,1848,349,845,667,741,485,1820,910,963,1484,1477,441,846, 1731,1118,1206,1139,1436,1475,1508,1490,922,489,1366,1434,996,1690,1079,343, 813,470,2000,1689,857,1683,382,1339,1468,191,890,885,1213,1724,956,127,1597, 445,829,1598,1849,501,1087,254,755,764,1522,892,638,251,1214,762,575,954, 1894,889,1835,1718,506,1905,1721,1466,1401,508,1852,702,733,1465,1898,998, 239,1623,1001,253,247,1327,886,1150,1431,1516,942,1658,1780,1383,431,1269, 1694,1259,695,1016,1395,1267,446,971,1972,1955,351,1957,982,1147,1838,1454, 1143,1459,1657,727,1897,1993,478,1881,1691,477,757,925,1183,1831,1958,1906, 1009,1976,1453,491,223,2008,926,1643,1389,1373,1437,2018,861,1462,1870,1703, 950,1819,1485,923,985,1199,1447,1239,1507,981,1822,1962,1845,1987,1996,1245, 1367,1687,1945,1639,2004,947,731,1435,949,1741,911,1651,967,1867,1710,1927, 607,1754,1273,1493,1398,859,1514,499,1211,1207,1869,919,1941,2001,1884,1821, 1010,1707,1486,1521,1931,1961,623,1461,1735,1497,1528,973,1994,502,1002,749, 1875,1243,1778,2032,758,1595,1012,1491,1335,988,1756,855,1646,1739,875,1837, 381,1645,1846,761,1231,1119,1255,375,1524,1784,1451,1722,1939,367,878,1942, 1843,1261,1359,1747,1423,1807,1772,1877,1483,1513,997,1262 }; int over(int n, int k) { long result = 1; for (int i = 1; i <= k; i++, n--) result = result * n / i; return result; } #define HAS_LINE(v,b) (((v) & (1 << (b))) != 0) int nr_lines(int vec) { int nr_l = 0; for (int l = 0; l < 11; l++) if (HAS_LINE(vec, l)) nr_l++; return nr_l; } inline int abs(int i) { return i < 0 ? -i : i; } int logo_nr_diff(int logo_vec1, int logo_vec2) { int diff = 0; for (int l = 0; l < 11; l++) if (HAS_LINE(logo_vec1, l) != HAS_LINE(logo_vec2, l)) diff++; return diff; } int mirror_vec(int vec) { static int mirror_lines[11] = { 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 10 }; int result = 0; for (int l = 0; l < 11; l++) if (HAS_LINE(vec, l)) result |= (1 << mirror_lines[l]); return result; } int phase = 1; #define TO_VEC(I,J) ((I)*27+(J)) #define I_OF(V) ((V)/27) #define J_OV(V) ((V)%27) int badness(int i, int j) { int vec1 = data_vec[TO_VEC(i, j)]; int c = 0; for (int i2 = -2; i2 <= 2; i2++) if (i + i2 >= 0 && i + i2 < 18) for (int j2 = -2; j2 <= 2; j2++) if (j + j2 >= 0 && j + j2 < 27 && (i2 != 0 || j2 != 0)) { if (abs(i2) + abs(j2) <= 1) { int vec2 = data_vec[TO_VEC(i+i2, j+j2)]; int diff = logo_nr_diff(vec1, vec2); if (diff <= 4 || mirror_vec(vec1) == vec2) c += 5; } else if (abs(i2) + abs(j2) <= 2) { int vec2 = data_vec[TO_VEC(i+i2, j+j2)]; int diff = logo_nr_diff(vec1, vec2); if (diff <= 2 || mirror_vec(vec1) == vec2) c++; } } return c; } int total_badness() { int new_badness = 0; for (int j = 0; j < 27; j++) for (int i = 0; i < 18; i++) new_badness += badness(i, j); return new_badness; } void find_better() { int crown = TO_VEC(10, 16); for (;;) { int cur_badness = total_badness(); if (cur_badness == 0) break; printf("\33[0;0f"); int most_bad[10]; int most_bad_pos[10]; int nr = 0; for (int i = 0; i < 18; i++) { for (int j = 0; j < 27; j++) printf("%4d", badness(i, j)); printf("\n"); } printf("%d \n", cur_badness); clock_t till = clock() + CLOCKS_PER_SEC/2; for (;clock() < till;) { int p = rand() % (NR-1); int q = rand() % (NR-2); if (q >= p) q++; if (p >= crown) p++; if (q >= crown) q++; int vec1 = data_vec[p]; int vec2 = data_vec[q]; if (nr_lines(vec1) == nr_lines(vec2)) { data_vec[p] = vec2; data_vec[q] = vec1; int new_badness = total_badness(); if (new_badness > cur_badness) { data_vec[p] = vec1; data_vec[q] = vec2; } if (new_badness < cur_badness) break; } } } printf("---------\n"); for (int i = 0; i < NR; i++) printf("%d,", data_vec[i]); } struct { int x, y; } ppos[7] = { { 0, 0 }, { 6, 0 }, { 0, 6 }, { 6, 6 }, { 3, 0 }, { 2, 2 }, { 4, 2 }, }; struct { int f, t; } lines[11] = { { 1, 3 }, { 1, 6 }, { 4, 6 }, { 4, 5 }, { 0, 5 }, { 0, 2 }, { 3, 6 }, { 3, 5 }, { 2, 6 }, { 2, 5 }, { 2, 3 }, }; void draw_svg() { FILE *f = fopen("KABK.svg","wt"); if (f == 0) { fprintf(stderr, "Cannot open file KABK.svg\n"); return; } fprintf(f, "\n"); for (int j = 0; j < 27; j++) { for (int i = 0; i < 18; i++) { int vec = data_vec[i*27 + j]; int x = 20+i*40; int y = 20+j*40; for (int p = 0; p < 7; p++) fprintf(f, "\n", x + 4*ppos[p].x, y + 4*ppos[p].y); for (int l = 0; l < 11; l++) if ((vec & (1 << l)) != 0) fprintf(f, "\n", x + 4*ppos[lines[l].f].x, y + 4*ppos[lines[l].f].y, x + 4*ppos[lines[l].t].x, y + 4*ppos[lines[l].t].y); } } fprintf(f, ""); fclose(f); } int main(int argc, char *argv[]) { find_better(); draw_svg(); return 0; }