fork download
  1. #include <array>
  2. #include <cstddef>
  3. #include <iostream>
  4. #include <set>
  5. #include <tuple>
  6. #include <vector>
  7.  
  8. // The individual 8x8 pixel tiles
  9. struct Tile
  10. {
  11. enum
  12. {
  13. blank,
  14. cloud1, cloud2, cloud3, cloud4, cloud5, cloud6, cloud7, cloud8, cloud9,
  15. bush1, bush2, bush3, bush4, bush5,
  16. floor1, floor2, floor3, floor4,
  17. mound1, mound2, mound3, mound4, mound5, mound6,
  18. pipe1, pipe2, pipe3, pipe4,
  19. pipetop1, pipetop2, pipetop3, pipetop4, pipetop5, pipetop6, pipetop7, pipetop8,
  20. bricks,
  21. mystery1, mystery2, mystery3, mystery4,
  22. block1, block2, block3, block4,
  23. pole1, pole2,
  24. poletop1, poletop2,
  25. castledoor1, castledoor2, castledoor3,
  26. castletop1, castletop2, castletop3, castletop4,
  27.  
  28. num
  29. };
  30. };
  31.  
  32. // Blocks made up from 2x2 tiles
  33. struct Block
  34. {
  35. enum
  36. {
  37. blank,
  38.  
  39. cloud_top_left,
  40. cloud_top_middle,
  41. cloud_top_right,
  42. cloud_bottom_left,
  43. cloud_bottom_middle,
  44. cloud_bottom_right,
  45.  
  46. bush_left,
  47. bush_middle,
  48. bush_right,
  49.  
  50. floor,
  51.  
  52. mound_top,
  53. mound_left,
  54. mound_center,
  55. mound_center_detail,
  56. mound_right,
  57.  
  58. pipe_left,
  59. pipe_right,
  60.  
  61. pipetop_left,
  62. pipetop_right,
  63.  
  64. bricks,
  65.  
  66. mystery,
  67.  
  68. block,
  69.  
  70. pole,
  71.  
  72. poletop,
  73.  
  74. castledoor_top,
  75. castledoor_bottom,
  76.  
  77. castlewindow_1,
  78. castlewindow_2,
  79.  
  80. castletop_1,
  81. castletop_2,
  82.  
  83. num
  84. };
  85.  
  86. std::array<int, 4> tiles;
  87. };
  88.  
  89.  
  90. // Block definitions, order 0 1
  91. // 2 3
  92. Block block_defs[] =
  93. {
  94. {{Tile::blank, Tile::blank, Tile::blank, Tile::blank}},
  95.  
  96. {{Tile::blank, Tile::blank, Tile::blank, Tile::cloud3}},
  97. {{Tile::cloud1, Tile::cloud2, Tile::cloud4, Tile::cloud4}},
  98. {{Tile::blank, Tile::blank, Tile::cloud5, Tile::blank}},
  99. {{Tile::blank, Tile::cloud6, Tile::blank, Tile::blank}},
  100. {{Tile::cloud7, Tile::cloud8, Tile::blank, Tile::blank}},
  101. {{Tile::cloud9, Tile::blank, Tile::blank, Tile::blank}},
  102.  
  103. {{Tile::blank, Tile::blank, Tile::blank, Tile::bush3}},
  104. {{Tile::bush1, Tile::bush2, Tile::bush4, Tile::bush4}},
  105. {{Tile::blank, Tile::blank, Tile::bush5, Tile::blank}},
  106.  
  107. {{Tile::floor1, Tile::floor2, Tile::floor3, Tile::floor4}},
  108.  
  109. {{Tile::blank, Tile::blank, Tile::mound1, Tile::mound2}},
  110. {{Tile::blank, Tile::mound3, Tile::mound3, Tile::mound4}},
  111. {{Tile::mound4, Tile::mound4, Tile::mound4, Tile::mound4}},
  112. {{Tile::mound4, Tile::mound5, Tile::mound4, Tile::mound4}},
  113. {{Tile::mound6, Tile::blank, Tile::mound4, Tile::mound6}},
  114.  
  115. {{Tile::pipe1, Tile::pipe2, Tile::pipe1, Tile::pipe2}},
  116. {{Tile::pipe3, Tile::pipe4, Tile::pipe3, Tile::pipe4}},
  117.  
  118. {{Tile::pipetop1, Tile::pipetop2, Tile::pipetop3, Tile::pipetop4}},
  119. {{Tile::pipetop5, Tile::pipetop6, Tile::pipetop7, Tile::pipetop8}},
  120.  
  121. {{Tile::bricks, Tile::bricks, Tile::bricks, Tile::bricks}},
  122.  
  123. {{Tile::mystery1, Tile::mystery2, Tile::mystery3, Tile::mystery4}},
  124.  
  125. {{Tile::block1, Tile::block2, Tile::block3, Tile::block4}},
  126.  
  127. {{Tile::pole1, Tile::pole2, Tile::pole1, Tile::pole2}},
  128.  
  129. {{Tile::blank, Tile::blank, Tile::poletop1, Tile::poletop2}},
  130.  
  131. {{Tile::castledoor1, Tile::castledoor2, Tile::castledoor3, Tile::castledoor3}},
  132. {{Tile::castledoor3, Tile::castledoor3, Tile::castledoor3, Tile::castledoor3}},
  133.  
  134. {{Tile::bricks, Tile::castledoor3, Tile::bricks, Tile::castledoor3}},
  135. {{Tile::castledoor3, Tile::bricks, Tile::castledoor3, Tile::bricks}},
  136.  
  137. {{Tile::castletop1, Tile::castletop2, Tile::bricks, Tile::bricks}},
  138. {{Tile::castletop3, Tile::castletop4, Tile::bricks, Tile::bricks}}
  139. };
  140.  
  141.  
  142. std::set<std::tuple<int, int>> tile_pairs;
  143. std::size_t map_size = 0;
  144.  
  145. void add(int x, int y, const std::vector<int>& v)
  146. {
  147. int last_tile_top = Tile::blank;
  148. int last_tile_bottom = Tile::blank;
  149. for (int i : v)
  150. {
  151. const Block& b = block_defs[i];
  152.  
  153. for (int t = 0; t < 2; t++)
  154. {
  155. if (b.tiles[t] != Tile::blank || last_tile_top != Tile::blank)
  156. {
  157. tile_pairs.insert(std::make_tuple(last_tile_top, b.tiles[t]));
  158. }
  159.  
  160. if (b.tiles[t+2] != Tile::blank || last_tile_bottom != Tile::blank)
  161. {
  162. tile_pairs.insert(std::make_tuple(last_tile_bottom, b.tiles[t+2]));
  163. }
  164.  
  165. last_tile_top = b.tiles[t];
  166. last_tile_bottom = b.tiles[t+2];
  167. }
  168.  
  169. if (last_tile_top != Tile::blank)
  170. {
  171. tile_pairs.insert(std::make_tuple(last_tile_top, Tile::blank));
  172. }
  173.  
  174. if (last_tile_bottom != Tile::blank)
  175. {
  176. tile_pairs.insert(std::make_tuple(last_tile_bottom, Tile::blank));
  177. }
  178. }
  179.  
  180. map_size += (2 + v.size() * 2) * 2;
  181. }
  182.  
  183. void add(int x1, int x2, int y, int t)
  184. {
  185. const int size = x2 - x1 + 1;
  186. add(x1, y, std::vector<int>(size, t));
  187. map_size -= (2 + size * 2) * 2;
  188. map_size += 5 * 2;
  189. }
  190.  
  191. int main()
  192. {
  193. // row 1
  194. add(19, 1, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  195. add(36, 1, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_right});
  196. add(67, 1, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  197. add(84, 1, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_right});
  198. add(115, 1, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  199. add(132, 1, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_right});
  200. add(163, 1, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  201. add(180, 1, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_right});
  202. add(198, 1, {Block::poletop});
  203.  
  204. // row 2
  205. add(8, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  206. add(19, 2, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  207. add(27, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_right});
  208. add(36, 2, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  209. add(56, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  210. add(67, 2, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  211. add(75, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_right});
  212. add(84, 2, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  213. add(104, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  214. add(115, 2, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  215. add(123, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_right});
  216. add(132, 2, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  217. add(152, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  218. add(163, 2, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  219. add(171, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_middle, Block::cloud_top_right});
  220. add(180, 2, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  221. add(198, 2, {Block::pole});
  222. add(200, 2, {Block::cloud_top_left, Block::cloud_top_middle, Block::cloud_top_right});
  223.  
  224. // row 3
  225. add(8, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  226. add(27, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  227. add(56, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  228. add(75, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  229. add(104, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  230. add(123, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  231. add(152, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  232. add(171, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  233. add(198, 3, {Block::pole});
  234. add(200, 3, {Block::cloud_bottom_left, Block::cloud_bottom_middle, Block::cloud_bottom_right});
  235.  
  236. // row 4
  237. add(22, 4, {Block::mystery});
  238. add(80, 87, 4, Block::bricks);
  239. add(91, 4, {Block::bricks, Block::bricks, Block::bricks, Block::mystery});
  240. add(109, 4, {Block::mystery});
  241. add(121, 4, {Block::bricks, Block::bricks, Block::bricks});
  242. add(128, 4, {Block::bricks, Block::mystery, Block::mystery, Block::bricks});
  243. add(188, 189, 4, Block::block);
  244. add(198, 4, {Block::pole});
  245.  
  246. // row 5
  247. add(187, 189, 5, Block::block);
  248. add(198, 5, {Block::pole});
  249.  
  250. // row 6
  251. add(186, 189, 6, Block::block);
  252. add(198, 6, {Block::pole});
  253.  
  254. // row 7
  255. add(185, 189, 7, Block::block);
  256. add(198, 7, {Block::pole});
  257. add(203, 7, {Block::castletop_1, Block::castletop_1, Block::castletop_1});
  258.  
  259. // row 8
  260. add(16, 8, {Block::mystery});
  261. add(20, 8, {Block::bricks, Block::mystery, Block::bricks, Block::mystery, Block::bricks});
  262. add(46, 8, {Block::pipetop_left, Block::pipetop_right});
  263. add(57, 8, {Block::pipetop_left, Block::pipetop_right});
  264. add(77, 8, {Block::bricks, Block::mystery, Block::bricks});
  265. add(94, 8, {Block::bricks});
  266. add(100, 8, {Block::bricks});
  267. add(106, 8, {Block::mystery});
  268. add(109, 8, {Block::mystery});
  269. add(112, 8, {Block::mystery});
  270. add(118, 8, {Block::bricks});
  271. add(129, 8, {Block::bricks, Block::bricks});
  272. add(137, 8, {Block::block});
  273. add(140, 8, {Block::block});
  274. add(151, 8, {Block::block, Block::block});
  275. add(155, 8, {Block::block});
  276. add(168, 8, {Block::bricks, Block::bricks, Block::mystery, Block::bricks});
  277. add(184, 189, 8, Block::block);
  278. add(198, 7, {Block::pole});
  279. add(203, 7, {Block::castlewindow_1, Block::bricks, Block::castlewindow_2});
  280.  
  281. // row 9
  282. add(38, 9, {Block::pipetop_left, Block::pipetop_right});
  283. add(46, 9, {Block::pipe_left, Block::pipe_right});
  284. add(50, 9, {Block::mound_top});
  285. add(57, 9, {Block::pipe_left, Block::pipe_right});
  286. add(98, 9, {Block::mound_top});
  287. add(136, 9, {Block::block, Block::block});
  288. add(140, 9, {Block::block, Block::block});
  289. add(150, 9, {Block::block, Block::block, Block::block});
  290. add(155, 9, {Block::block, Block::block});
  291. add(183, 189, 9, Block::block);
  292. add(194, 9, {Block::mound_top});
  293. add(198, 9, {Block::pole});
  294. add(202, 9, {Block::castletop_1, Block::castletop_2, Block::castletop_2, Block::castletop_1});
  295.  
  296. // row 10
  297. add(1, 10, {Block::mound_left, Block::mound_center_detail, Block::mound_right});
  298. add(17, 10, {Block::mound_top});
  299. add(28, 10, {Block::pipetop_left, Block::pipetop_right});
  300. add(38, 10, {Block::pipe_left, Block::pipe_right});
  301. add(46, 10, {Block::pipe_left, Block::pipe_right});
  302. add(49, 10, {Block::mound_left, Block::mound_center_detail, Block::mound_right});
  303. add(57, 10, {Block::pipe_left, Block::pipe_right});
  304. add(65, 10, {Block::mound_top});
  305. add(97, 10, {Block::mound_left, Block::mound_center_detail, Block::mound_right});
  306. add(113, 10, {Block::mound_top});
  307. add(135, 10, {Block::block, Block::block, Block::block});
  308. add(140, 10, {Block::block, Block::block, Block::block});
  309. add(145, 10, {Block::mound_left, Block::mound_center_detail, Block::mound_right});
  310. add(149, 10, {Block::block, Block::block, Block::block, Block::block});
  311. add(155, 10, {Block::block, Block::block, Block::block});
  312. add(161, 10, {Block::mound_top});
  313. add(163, 10, {Block::pipetop_left, Block::pipetop_right});
  314. add(179, 10, {Block::pipetop_left, Block::pipetop_right});
  315. add(182, 189, 10, Block::block);
  316. add(193, 10, {Block::mound_left, Block::mound_center_detail, Block::mound_right});
  317. add(198, 10, {Block::pole});
  318. add(202, 10, {Block::bricks, Block::bricks, Block::castledoor_top, Block::bricks, Block::bricks});
  319. add(209, 10, {Block::mound_top});
  320.  
  321. // row 11
  322. add(0, 11, {Block::mound_left, Block::mound_center_detail, Block::mound_center, Block::mound_center_detail, Block::mound_right});
  323. add(11, 11, {Block::bush_left, Block::bush_middle, Block::bush_middle, Block::bush_middle, Block::bush_right, Block::mound_left, Block::mound_center_detail, Block::mound_right});
  324. add(23, 11, {Block::bush_left, Block::bush_middle, Block::bush_right});
  325. add(28, 11, {Block::pipe_left, Block::pipe_right});
  326. add(38, 11, {Block::pipe_left, Block::pipe_right});
  327. add(41, 11, {Block::bush_left, Block::bush_middle, Block::bush_middle, Block::bush_right});
  328. add(46, 11, {Block::pipe_left, Block::pipe_right, Block::mound_left, Block::mound_center_detail, Block::mound_center, Block::mound_center_detail, Block::mound_right});
  329. add(57, 11, {Block::pipe_left, Block::pipe_right, Block::bush_left, Block::bush_middle, Block::bush_middle, Block::bush_middle, Block::bush_right, Block::mound_left, Block::mound_center_detail, Block::mound_right});
  330. add(71, 11, {Block::bush_left, Block::bush_middle, Block::bush_right});
  331. add(89, 11, {Block::bush_left, Block::bush_middle, Block::bush_middle, Block::bush_right});
  332. add(96, 11, {Block::mound_left, Block::mound_center_detail, Block::mound_center, Block::mound_center_detail, Block::mound_right});
  333. add(107, 11, {Block::bush_left, Block::bush_middle, Block::bush_middle, Block::bush_middle, Block::bush_right, Block::mound_left, Block::mound_center_detail, Block::mound_right});
  334. add(119, 11, {Block::bush_left, Block::bush_middle, Block::bush_right});
  335. add(134, 11, {Block::block, Block::block, Block::block, Block::block, Block::bush_middle, Block::bush_middle, Block::block, Block::block, Block::block, Block::block, Block::mound_left, Block::mound_center_detail, Block::mound_center, Block::mound_center_detail, Block::block, Block::block, Block::block, Block::block, Block::block});
  336. add(155, 11, {Block::block, Block::block, Block::block, Block::block, Block::bush_right, Block::mound_left, Block::mound_center_detail, Block::mound_right, Block::pipe_left, Block::pipe_right});
  337. add(167, 11, {Block::bush_left, Block::bush_middle, Block::bush_right});
  338. add(179, 11, {Block::pipe_left, Block::pipe_right, Block::block, Block::block, Block::block, Block::block, Block::block, Block::block, Block::block, Block::block, Block::block});
  339. add(192, 11, {Block::mound_left, Block::mound_center_detail, Block::mound_center, Block::mound_center_detail, Block::mound_right});
  340. add(198, 11, {Block::block});
  341. add(202, 11, {Block::bricks, Block::bricks, Block::castledoor_bottom, Block::bricks, Block::bricks, Block::bush_right, Block::mound_left, Block::mound_center_detail, Block::mound_right});
  342.  
  343. // row 12
  344. add(0, 68, 12, Block::floor);
  345. add(71, 85, 12, Block::floor);
  346. add(89, 152, 12, Block::floor);
  347. add(155, 211, 12, Block::floor);
  348.  
  349. std::cout << "Number of tiles: " << Tile::num << std::endl;
  350. std::cout << "Number of blocks: " << Block::num << std::endl;
  351. std::cout << "Number tile pairs: " << tile_pairs.size() << std::endl;
  352. std::cout << "Map size: " << map_size << std::endl;
  353.  
  354. for (const auto& tp : tile_pairs)
  355. {
  356. std::cout << std::get<0>(tp) << ", " << std::get<1>(tp) << std::endl;
  357. }
  358. }
Success #stdin #stdout 0s 3484KB
stdin
Standard input is empty
stdout
Number of tiles: 57
Number of blocks: 31
Number tile pairs: 129
Map size: 2116
0, 1
0, 3
0, 6
0, 10
0, 12
0, 15
0, 17
0, 19
0, 21
0, 25
0, 29
0, 31
0, 37
0, 38
0, 40
0, 42
0, 44
0, 46
0, 48
0, 53
1, 2
2, 0
2, 1
3, 0
3, 4
4, 0
4, 4
4, 5
5, 0
6, 0
6, 7
7, 8
8, 0
8, 7
8, 9
9, 0
10, 11
11, 0
11, 10
11, 42
12, 0
12, 13
13, 0
13, 13
13, 14
13, 44
14, 0
15, 16
16, 0
16, 15
17, 18
18, 0
18, 17
19, 20
20, 0
21, 0
21, 22
22, 0
22, 22
22, 23
22, 24
22, 44
23, 0
23, 22
23, 24
23, 42
24, 0
24, 25
25, 26
26, 0
26, 27
27, 28
28, 0
28, 21
28, 42
28, 44
29, 30
30, 0
30, 33
31, 32
32, 0
32, 35
33, 34
34, 0
35, 36
36, 0
37, 0
37, 14
37, 37
37, 38
37, 40
37, 50
37, 52
38, 39
39, 0
39, 37
39, 38
40, 41
41, 0
41, 37
41, 40
42, 43
43, 0
43, 10
43, 42
44, 45
45, 0
45, 13
45, 14
45, 21
45, 44
46, 47
47, 0
48, 49
49, 0
50, 51
51, 0
51, 37
52, 0
52, 37
52, 52
53, 54
54, 0
54, 53
54, 55
55, 56
56, 0
56, 53
56, 55