Language: C++
/* UVa 183 - Bit Maps To build using Visual Studio 2012: cl -EHsc -O2 UVa_183_Bit_Maps.cpp */ #include <cstdio> const int rows_max = 200, columns_max = 200; int bitmap[rows_max][columns_max]; int sums[rows_max][columns_max]; // sum[i][j] is the sum of bitmap[bi][bj] (0 <= bi <= i, 0 <= bj <= j) const int nr_chars_max = 50; int nr_chars; int zeros_ones(int top, int left, int bottom, int right) { int s = sums[bottom][right]; if (top && left) s += sums[top - 1][left - 1] - sums[top - 1][right] - sums[bottom][left - 1]; else if (top) s -= sums[top - 1][right]; else if (left) s -= sums[bottom][left - 1]; if (!s) return 0; // all zeros else if (s == (bottom - top + 1) * (right - left + 1)) return 1; // all ones else return -1; } void bitmap_putchar(char c) { putchar(c); if (++nr_chars == nr_chars_max) { nr_chars = 0; putchar('\n'); } } void quarters(int top, int left, int bottom, int right) { int zo = zeros_ones(top, left, bottom, right); if (zo >= 0) // all zeros or ones bitmap_putchar(static_cast<char>(zo + '0')); else { bitmap_putchar('D'); int rows = bottom - top + 1, columns = right - left + 1; if (rows > 1 && columns > 1) { quarters(top, left, top + (rows - 1) / 2, left + (columns - 1) / 2); quarters(top, left + (columns + 1) / 2, top + (rows - 1) / 2, right); quarters(top + (rows + 1) / 2, left, bottom, left + (columns - 1) / 2); quarters(top + (rows + 1) / 2, left + (columns + 1) / 2, bottom, right); } else if (rows > 1) { quarters(top, left, top + (rows - 1) / 2, right); quarters(top + (rows + 1) / 2, left, bottom, right); } else { quarters(top, left, bottom, left + (columns - 1) / 2); quarters(top, left + (columns + 1) / 2, bottom, right); } } } void decomposition(int rows, int columns) { for (int r = 0; r < rows; r++) { int ones = 0; for (int c = 0; c < columns; c++) { char zero_or_one; do zero_or_one = getchar(); while (zero_or_one == '\n'); bitmap[r][c] = zero_or_one - '0'; ones += bitmap[r][c]; sums[r][c] = ones; if (r) sums[r][c] += sums[r - 1][c]; } } #ifdef DEBUG for (int r = 0; r < rows; r++) for (int c = 0; c < columns; c++) fprintf(stderr, "%4d%c", bitmap[r][c], ((c == columns - 1) ? '\n' : ' ')); for (int r = 0; r < rows; r++) for (int c = 0; c < columns; c++) fprintf(stderr, "%4d%c", sums[r][c], ((c == columns - 1) ? '\n' : ' ')); #endif quarters(0, 0, rows - 1, columns - 1); if (nr_chars) putchar('\n'); } void composition(int top, int left, int bottom, int right) { char c; do c = getchar(); while (c == '\n'); if (c == '0' || c == '1') { c -= '0'; for (int i = top; i <= bottom; i++) for (int j = left; j <= right; j++) bitmap[i][j] = c; } else { // 'D' int rows = bottom - top + 1, columns = right - left + 1; if (rows > 1 && columns > 1) { composition(top, left, top + (rows - 1) / 2, left + (columns - 1) / 2); composition(top, left + (columns + 1) / 2, top + (rows - 1) / 2, right); composition(top + (rows + 1) / 2, left, bottom, left + (columns - 1) / 2); composition(top + (rows + 1) / 2, left + (columns + 1) / 2, bottom, right); } else if (rows > 1) { composition(top, left, top + (rows - 1) / 2, right); composition(top + (rows + 1) / 2, left, bottom, right); } else { composition(top, left, bottom, left + (columns - 1) / 2); composition(top, left + (columns + 1) / 2, bottom, right); } } } int main() { while (true) { char format[2]; scanf("%s", format); if (format[0] == '#') break; int rows, columns; scanf("%d %d", &rows, &columns); nr_chars = 0; if (format[0] == 'B') { printf("%c%4d%4d\n", 'D', rows, columns); decomposition(rows, columns); } else { composition(0, 0, rows - 1, columns - 1); printf("%c%4d%4d\n", 'B', rows, columns); for (int r = 0; r < rows; r++) for (int c = 0; c < columns; c++) bitmap_putchar(static_cast<char>(bitmap[r][c] + '0')); if (nr_chars) putchar('\n'); } } return 0; }
No comments:
Post a Comment