20111112

ACM 706 LC-Display

寫得滿暴力的。
關鍵在於,單單輸出一個數字時很簡單,
但是一次輸出多個數字,就是同時處理多個數字。

也就是第一行要輸出每個數字的第一行,
二行要輸出每個數字的第二行。

所以算則就是這樣,
依照數字與行數做相對應輸出。

輸出的字元可以化簡為幾種:
(1)空白
(2)最右邊為「|」
(3)最左邊為「|」
(4)最左跟最右邊為「|」
(5)中間為「-」

/* ACM 706 LC-Display
 * mythnc
 * 2011/11/12 21:54:59   
 * run time: 0.032
 */
#include <stdio.h>

#define MAXCHAR 10

void printn(char, int, int);
void space(int);
void right(int);
void middle(int);
void left(int);
void landr(int);

int main(void)
{
    char str[MAXCHAR];
    int n, i, j;

    while (scanf("%d %s", &n, str) && n != 0) {
        for (i = 0; i < 2 * n + 3; i++) {       /* line */
            for (j = 0; str[j] != '\0'; j++) {  /* number */
                if (j > 0)
                    putchar(' ');
                printn(str[j], i, n);
            }
            putchar('\n');
        }
        putchar('\n');
    }
    return 0;
}

/* printn: depend on row value and char c to do output */
void printn(char c, int row, int n)
{
    int col, head, mid, tail;

    col = n + 2;
    head = 0;
    mid = (2 * n + 3) / 2;
    tail = 2 * n + 2;   /* (2 * n + 3) - 1 */
    switch (c) {
        case '1':
            if (row == head || row == mid || row == tail)
                space(col);
            else
                right(col);
            break;
        case '2':
            if (row == head || row == mid || row == tail)
                middle(col);
            else if (row < mid)
                right(col);
            else
                left(col);
            break;
        case '3':
            if (row == head || row == mid || row == tail)
                middle(col);
            else
                right(col);
            break;
        case '4':
            if (row == head || row == tail)
                space(col);
            else if (row < mid)
                landr(col);
            else if (row == mid)
                middle(col);
            else
            right(col);
            break;
        case '5':
            if (row == head || row == mid || row == tail)
                middle(col);
            else if (row < mid)
                left(col);
            else
                right(col);
            break;
        case '6':
            if (row == head || row == mid || row == tail)
                middle(col);
            else if (row < mid)
                left(col);
            else
                landr(col);
            break;
        case '7':
            if (row == head)
                middle(col);
            else if (row == mid || row == tail)
                space(col);
            else
                right(col);
            break;
        case '8':
            if (row == head || row == mid || row == tail)
                middle(col);
            else
                landr(col);
            break;
        case '9':
            if (row == head || row == mid || row == tail)
                middle(col);
            else if (row < mid)
                landr(col);
            else
                right(col);
            break;
        case '0':
            if (row == head || row == tail)
                middle(col);
            else if (row == mid)
                space(col);
            else
                landr(col);
    }
}

/* space: print ' ' */
void space(int n)
{
    while (n--)
        putchar(' ');
}

/* right: print '|' in the rightmost */
void right(int n)
{
    int i;

    for (i = 0; i < n - 1; i++)
        putchar(' ');
    putchar('|');
}

/* middle: print '-' in middle */
void middle(int n)
{
    int i;

    putchar(' ');
    for (i = 1; i < n - 1; i++)
        putchar('-');
    putchar(' ');
}

/* left: print '|' in leftmost */
void left(int n)
{
    int i;

    putchar('|');
    for (i = 1; i < n; i++)
        putchar(' ');
}

/* landr: print '|' in leftmost and rightmost */
void landr(int n)
{
    int i;

    putchar('|');
    for (i = 1; i < n - 1; i++)
        putchar(' ');
    putchar('|');
}

沒有留言: