UVA232 UVALive5171 POJ1888 Crossword Answers

本文提供了一种使用C语言解决典型单词谜题的方法,通过计算单词个数并输出答案。通过在网格周围添加边界简化程序逻辑,并明确了开始网格的条件及单词序号计算方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

World Finals >> 1994 - Phoenix

问题链接:UVA232 UVALive5171 POJ1888 Crossword Answers基础训练级的问题,用C语言编写程序。

典型单词谜题中,计算单词个数问题。

给网格扩充了四个方向的边界。这样可以简化程序逻辑,使得边缘格的处理逻辑与中间格的处理逻辑相同。使得判断网格是否为单词的开始网格条件统一;同时,计算行单词和列单词的逻辑也变得简单。

另外一点就是要明确单纯开始网格的条件,以及如何计算单词的序号(序号增加的条件)。


程序中,将边界设置为“*”,程序逻辑比较简洁。

AC的C语言程序如下:

/* UVA232 UVALive5171 POJ1888 Crossword Answers */

#include <stdio.h>

#define MAXN 10

char grid[MAXN+2][MAXN+2];

/* 输出行单词 */
void rowoutput(int no, int row, int col)
{
    printf("%3d.", no);
    while(grid[row][col] != '*')
        putchar(grid[row][col++]);
    putchar('\n');
}

/* 输出列单词 */
void coloutput(int no, int row, int col)
{
    printf("%3d.", no);
    while(grid[row][col] != '*')
        putchar(grid[row++][col]);
    putchar('\n');
}

int main(void)
{
    int r, c, caseno=0, wcount, i, j;

    while(scanf("%d", &r) != EOF && r != 0) {
        /* 已经读入行,继续读入列 */
        scanf("%d", &c);
        getchar();

        /* 读入网格 */
        for(i=1; i<=r; i++) {
            for(j=1; j<=c; j++)
                grid[i][j] = getchar();
            getchar();      /* '\n' */
        }

        // 设置边界
        for(i=0; i<r+2; i++) {
            grid[i][0] = '*';
            grid[i][c+1] = '*';
        }
        for(i=0; i<c+2; i++) {
            grid[0][i] = '*';
            grid[r+1][i] = '*';
        }

        /* 计算并且输出结果 */
        if(++caseno > 1)
            printf("\n");
        printf("puzzle #%d:\n", caseno);

        /* 行计算并且输出结果 */
        printf("Across\n");
        wcount = 0;
        for(i=1; i<=r; i++) {
            for(j=1; j<=c; j++)
                if(grid[i][j] != '*' && (grid[i-1][j] == '*' || grid[i][j-1] == '*')) {
                    wcount++;
                    if(grid[i][j-1] == '*')
                        rowoutput(wcount, i, j);
                }
        }

        /* 列计算并且输出结果 */
        printf("Down\n");
        wcount = 0;
        for(i=1; i<=r; i++) {
            for(j=1; j<=c; j++)
                if(grid[i][j] != '*' && (grid[i-1][j] == '*' || grid[i][j-1] == '*')) {
                    wcount++;
                    if(grid[i-1][j] == '*')
                        coloutput(wcount, i, j);
                }
        }
    }

    return 0;
}


转载于:https://www.cnblogs.com/tigerisland/p/7564518.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值