Advertisement
Guest User

Untitled

a guest
Jan 28th, 2015
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <string>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <set>
  9. #include <map>
  10. #include <cmath>
  11. using namespace std;
  12.  
  13. #ifdef LOCAL
  14. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  15. #else
  16. #define eprintf(...) 42
  17. #endif
  18.  
  19. const int N = 100;
  20. int table[N][N];
  21. char str[N][N];
  22.  
  23. vector <int> digits;
  24. vector <int> values;
  25.  
  26. int getSum(int x, int y, int size)
  27. {
  28. int sum = 0;
  29. for (int i = x; i < x + size; i++)
  30. for (int s = y; s < y + size; s++)
  31. sum += table[i][s];
  32. return sum;
  33. }
  34.  
  35. void fillRect(int x, int y, int size)
  36. {
  37. for (int i = x; i < x + size; i++)
  38. for (int s = y; s < y + size; s++)
  39. table[i][s] = 1;
  40. }
  41.  
  42. void changeCoord(int x, int y, int &nx, int &ny, int msize, int type)
  43. {
  44. if (type == 1)
  45. nx = x, ny = y;
  46. else if (type == 2)
  47. nx = x, ny = y + msize;
  48. else if (type == 3)
  49. nx = x + msize, ny = y;
  50. else
  51. nx = x + msize, ny = y + msize;
  52. }
  53.  
  54. int getValue()
  55. {
  56. int result = 0;
  57. for (int i = (int)digits.size() - 1; i >= 0; i--)
  58. {
  59. result = result * 5 + digits[i];
  60. }
  61. return result;
  62. }
  63.  
  64. void goTree(int x, int y, int size)
  65. {
  66. // eprintf("x = %d, y = %d, size = %d, sum = %d\n", x, y, size, getSum(x, y, size));
  67. if (getSum(x, y, size) == 0)
  68. return;
  69. if (getSum(x, y, size) == size * size)
  70. {
  71. values.push_back(getValue());
  72. return;
  73. }
  74. int msize = size / 2;
  75. int pos = (int)digits.size();
  76. digits.push_back(0);
  77. for (int d = 1; d < 5; d++)
  78. {
  79. int nx, ny;
  80. changeCoord(x, y, nx, ny, msize, d);
  81. digits[pos] = d;
  82. goTree(nx, ny, msize);
  83. }
  84. digits.pop_back();
  85. }
  86.  
  87. int imageIndex = 1;
  88.  
  89. void convertTo(int size)
  90. {
  91. values.clear();
  92. for (int i = 0; i < size; i++)
  93. scanf(" %s", str[i]);
  94. for (int i = 0; i < size; i++)
  95. for (int s = 0; s < size; s++)
  96. table[i][s] = str[i][s] - '0';
  97.  
  98. digits.clear();
  99. goTree(0, 0, size);
  100. sort(values.begin(), values.end());
  101. printf("Image %d\n", imageIndex);
  102. bool isFirst = true;
  103. for (int val : values)
  104. {
  105. if (!isFirst)
  106. printf(" ");
  107. printf("%d", val);
  108. isFirst = false;
  109. }
  110. if ((int)values.size() != 0)
  111. puts("");
  112. printf("Total number of black nodes = %d\n\n", (int)values.size());
  113. }
  114.  
  115. void convertTo5(int x)
  116. {
  117. digits.clear();
  118. while (x > 0)
  119. {
  120. digits.push_back(x % 5);
  121. x /= 5;
  122. }
  123. }
  124.  
  125. void convertFrom(int size)
  126. {
  127. for (int i = 0; i < size; i++)
  128. for (int s = 0; s < size; s++)
  129. table[i][s] = 0;
  130.  
  131. values.clear();
  132. int val;
  133. while (cin >> val)
  134. {
  135. if (val == -1)
  136. break;
  137. values.push_back(val);
  138. }
  139. for (int v : values)
  140. {
  141. convertTo5(v);
  142. int x = 0, y = 0;
  143. int curS = size;
  144. for (int d : digits)
  145. {
  146. curS /= 2;
  147. changeCoord(x, y, x, y, curS, d);
  148. }
  149. fillRect(x, y, curS);
  150. }
  151. printf("Image %d\n", imageIndex);
  152. for (int i = 0; i < size; i++, puts(""))
  153. for (int s = 0; s < size; s++)
  154. printf("%c", (table[i][s] ? '*' : '.'));
  155. puts("");
  156. }
  157.  
  158. int main()
  159. {
  160. freopen ("spatial.in", "r", stdin);
  161. freopen ("spatial.out", "w", stdout);
  162.  
  163. int size;
  164. while (cin >> size)
  165. {
  166. if (size == 0)
  167. break;
  168. if (size > 0)
  169. convertTo(size);
  170. else
  171. convertFrom(-size);
  172. imageIndex++;
  173. }
  174. return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement