纵横字谜的答案(Uva232)

纵横字谜的答案(Uva232)

题目UVa232,题目考察点时二维数组的使用。注意点是需要读懂题目意思,关键点是起始格需要用额外用一个数组存储。然后根据横向和纵向单词的定义,结合起始格,循环遍历打印输出即可。
纵向输出需要额外注意,是先从行开始,找出一个纵向单词,然后转到下一列,直到最后一列,然后再从第二行开始,重复以上步骤。为了防止重复输出,需要把遍历过的位置置0。

#include 
#include 

int main()
{

    int r, c;
    char p[12][12]; //字符数组
    int no[12][12]; //起始格位置记号
    int count = 0;
    while (scanf("%d%d\n", &r, &c) == 2 && r)
    {
        memset(no, 0, sizeof(no)); //初始化0
        count++;                   //记录题目组个数
        int pos = 1;               //起始格初值
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < c; j++)
            {
                scanf("%c", &p[i][j]);
                if (p[i][j] == '*') //跳过黑格
                {
                    continue;
                }
                if (j < 1 || p[i][j - 1] == '*' || i < 1 || p[i - 1][j] == '*') //左边相邻位置或者上边没有空格。
                {
                    no[i][j] = pos++;
                }
            }
            getchar(); //吸收换行符
        }

        if (count != 1) //每组题目换行隔开
        {
            printf("\n");
        }
        printf("puzzle #%d:\n", count);
        printf("Across\n");
        //横向输出
        for (int i = 0; i < r; i++)
        {
            int j = 0;
            while (j < c)
            {
                if (p[i][j] == '*' || no[i][j] == 0)
                {
                    j++;
                    continue;
                }
                printf("%3d.%c", no[i][j], p[i][j]);
                j++;
                while (j < c && p[i][j] != '*')
                {
                    printf("%c", p[i][j]);
                    j++;
                }
                printf("\n");
            }
        }

        /**纵向输出:以行为开始,以列为单词,
         * 顺序是,先从第一行,按列递增,找出改列的word。
         * 然后在从第二行,按列递增,找出改列的word。
         * ...
         * 所以在遍历过后,就要将该位置的no起始格置0.
         */
        printf("Down\n");
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < c; j++)
            {
                if (p[i][j] == '*' || no[i][j] == 0)
                {
                    continue;
                }
                printf("%3d.%c", no[i][j], p[i][j]);
                no[i][j] = 0;
                int k = i + 1;
                while (k < r && p[k][j] != '*')
                {
                    printf("%c", p[k][j]);
                    no[k][j] = 0;
                    k++;
                }
                printf("\n");
            }
        }
    }
}

你可能感兴趣的:(UVa题目解题集)