Crossword Answers

Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown

UVa 232
UVa 232
UVa 232


https://uva.onlinejudge.org/i...

Accepted Code

// Author : Weihao Long
// Created : 2017/12/21

#include "stdio.h"

struct node {
    char c;
    int no;
};

int is_alp(char c) {
    return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}

int main() {
    int r, c, flag = 1;
    while (scanf("%d", &r) != EOF) {
        if (!r)
            break;
        scanf("%d", &c);
        getchar();
        node a[12][12];
        int count = 1;
        for (int i = 1; i <= r; i++) {
            for (int k = 1; k <= c; k++) {
                scanf("%c", &a[i][k].c);
                a[i][k].no = 0;
                if (is_alp(a[i][k].c) && (i == 1 || k == 1 || !is_alp(a[i - 1][k].c) || !is_alp(a[i][k - 1].c)))
                    a[i][k].no = count++;
            }
            getchar();
        }
        if (flag != 1)
            printf("\n");
        printf("puzzle #%d:\n", flag++);
        printf("Across\n");
        for (int i = 1; i <= r; i++) {
            for (int k = 1; k <= c; k++) {
                if (is_alp(a[i][k].c)) {
                    printf("%3d.", a[i][k].no);
                    for (; k <= c && a[i][k].c != '*'; k++) {
                        printf("%c", a[i][k].c);
                    }
                    printf("\n");
                }
            }
        }
        printf("Down\n");
        for (int i = 1; i <= r; i++) {
            for (int k = 1; k <= c; k++) {
                if (a[i][k].no > 0 && is_alp(a[i][k].c)) {
                    printf("%3d.", a[i][k].no);
                    for (int ii = i; ii <= r && a[ii][k].c != '*'; ii++) {
                        printf("%c", a[ii][k].c);
                        a[ii][k].no = 0;
                    }
                    printf("\n");
                }
            }
        }
    }
    return 0;
}

Notes

题意:
输入一个 r 行 c 列的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上面相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。
首先把所有起始格按照从上到下、从左到右的顺序编号为 1,2,3,... ,如图所示。
接下来要找出所有的横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。
最后找出所有的竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。

思路:
定义包含一个字符型和一个整型的结构,同时描述一个格子的字母和编号。然后按要求操作即可。

算法:
第一步:录入数据同时判断是否为起始格,若是就对它编号。
第二步:输出横向单词:从编号小的格子开始横向输出,直到遇到黑格或边界为止。若是遇到黑格,则从黑格后继续。
第三步:输出纵向单词:从编号小的格子开始纵向输出,直到遇到黑格或边界为止。(鉴于扫描的机制,在竖向输出的同时要把输出过的格子的编号置为 '0',以免输出子串)

感受:
注意题目要求的输出格式。


龙威昊
4 声望5 粉丝