Run Time: 0.003
Ranking (as of 2016-02-25): 5 out of 361
Language: C++
/* UVa 10333 - The Tower of ASCII To build using Visual Studio 2012: cl -EHsc -O2 UVa_10333_The_Tower_of_ASCII.cpp */ #include <cstdio> const int H_max = 500; int nr_lefts, nr_rights, lefts[H_max], rights[H_max], left_heights[H_max + 1], right_heights[H_max + 1]; int main() { int H; for (int t = 1; scanf("%d", &H) != EOF; t++) { nr_lefts = 0, nr_rights = 0; for (int lh = 1, h = H; ; lh++) { if (h - lh > lh) { lefts[nr_lefts++] = lh; h -= lh; } else { lefts[nr_lefts++] = h; break; } } for (int i = 0; i < nr_lefts - 1; i++) rights[nr_rights++] = lefts[i]; rights[nr_rights - 1] += lefts[nr_lefts - 1]; left_heights[0] = right_heights[0] = 0; for (int i = 1; i <= nr_lefts; i++) left_heights[i] = left_heights[i - 1] + lefts[i - 1]; for (int i = 1; i <= nr_rights; i++) right_heights[i] = right_heights[i - 1] + rights[i - 1]; #ifdef DEBUG printf("left heights: "); for (int i = 0; i <= nr_lefts; i++) printf(" %d%c", left_heights[i], ((i < nr_lefts) ? ' ' : '\n')); printf("right heights: "); for (int i = 0; i <= nr_rights; i++) printf(" %d%c", right_heights[i], ((i < nr_rights) ? ' ' : '\n')); #endif printf("Tower #%d\n", t); int indent = nr_lefts - 1; for (int i = 0; i < indent; i++) printf(" "); puts("#****#"); for (int h = 1, lh = 1, rh = 1, w = 4; h < H; h++) { if (h == left_heights[lh]) indent--; for (int i = 0; i < indent; i++) printf(" "); if (h == left_heights[lh]) printf("#**"); else putchar('#'); for (int i = 0; i < w; i++) putchar('.'); if (h == right_heights[rh]) puts("**#"); else puts("#"); if (h == left_heights[lh]) w += 2; else if (h + 1 == left_heights[lh + 1]) lh++; if (h == right_heights[rh]) w += 2; else if (h + 1 == right_heights[rh + 1]) rh++; } putchar('\n'); } return 0; }
No comments:
Post a Comment