Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <string>
- #include <algorithm>
- #include <vector>
- #include <set>
- #include <map>
- #include <cmath>
- using namespace std;
- #ifdef LOCAL
- #define eprintf(...) fprintf(stderr, __VA_ARGS__)
- #else
- #define eprintf(...) 42
- #endif
- const int N = 100;
- int table[N][N];
- char str[N][N];
- vector <int> digits;
- vector <int> values;
- int getSum(int x, int y, int size)
- {
- int sum = 0;
- for (int i = x; i < x + size; i++)
- for (int s = y; s < y + size; s++)
- sum += table[i][s];
- return sum;
- }
- void fillRect(int x, int y, int size)
- {
- for (int i = x; i < x + size; i++)
- for (int s = y; s < y + size; s++)
- table[i][s] = 1;
- }
- void changeCoord(int x, int y, int &nx, int &ny, int msize, int type)
- {
- if (type == 1)
- nx = x, ny = y;
- else if (type == 2)
- nx = x, ny = y + msize;
- else if (type == 3)
- nx = x + msize, ny = y;
- else
- nx = x + msize, ny = y + msize;
- }
- int getValue()
- {
- int result = 0;
- for (int i = (int)digits.size() - 1; i >= 0; i--)
- {
- result = result * 5 + digits[i];
- }
- return result;
- }
- void goTree(int x, int y, int size)
- {
- // eprintf("x = %d, y = %d, size = %d, sum = %d\n", x, y, size, getSum(x, y, size));
- if (getSum(x, y, size) == 0)
- return;
- if (getSum(x, y, size) == size * size)
- {
- values.push_back(getValue());
- return;
- }
- int msize = size / 2;
- int pos = (int)digits.size();
- digits.push_back(0);
- for (int d = 1; d < 5; d++)
- {
- int nx, ny;
- changeCoord(x, y, nx, ny, msize, d);
- digits[pos] = d;
- goTree(nx, ny, msize);
- }
- digits.pop_back();
- }
- int imageIndex = 1;
- void convertTo(int size)
- {
- values.clear();
- for (int i = 0; i < size; i++)
- scanf(" %s", str[i]);
- for (int i = 0; i < size; i++)
- for (int s = 0; s < size; s++)
- table[i][s] = str[i][s] - '0';
- digits.clear();
- goTree(0, 0, size);
- sort(values.begin(), values.end());
- printf("Image %d\n", imageIndex);
- bool isFirst = true;
- for (int val : values)
- {
- if (!isFirst)
- printf(" ");
- printf("%d", val);
- isFirst = false;
- }
- if ((int)values.size() != 0)
- puts("");
- printf("Total number of black nodes = %d\n\n", (int)values.size());
- }
- void convertTo5(int x)
- {
- digits.clear();
- while (x > 0)
- {
- digits.push_back(x % 5);
- x /= 5;
- }
- }
- void convertFrom(int size)
- {
- for (int i = 0; i < size; i++)
- for (int s = 0; s < size; s++)
- table[i][s] = 0;
- values.clear();
- int val;
- while (cin >> val)
- {
- if (val == -1)
- break;
- values.push_back(val);
- }
- for (int v : values)
- {
- convertTo5(v);
- int x = 0, y = 0;
- int curS = size;
- for (int d : digits)
- {
- curS /= 2;
- changeCoord(x, y, x, y, curS, d);
- }
- fillRect(x, y, curS);
- }
- printf("Image %d\n", imageIndex);
- for (int i = 0; i < size; i++, puts(""))
- for (int s = 0; s < size; s++)
- printf("%c", (table[i][s] ? '*' : '.'));
- puts("");
- }
- int main()
- {
- freopen ("spatial.in", "r", stdin);
- freopen ("spatial.out", "w", stdout);
- int size;
- while (cin >> size)
- {
- if (size == 0)
- break;
- if (size > 0)
- convertTo(size);
- else
- convertFrom(-size);
- imageIndex++;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement