UVa232 ACM/ICPC 1994 纵横字谜的答案

本文介绍了一种网格填字游戏的解析方法,通过输入特定格式的网格,程序能够自动识别并输出横向和竖向的单词。使用C语言实现,重点在于如何识别起始格并按顺序填充数字,最后输出单词。

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

输入一个输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…。接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出格式和样例请参考原题。
#include <stdio.h>  
#include <string.h>      
int main(void)  
{  
    char buf[12][12];//用来存储字母  
    int num[12][12];//用来存放数字  
    int r,c;  
    int count=1,i,j;   
    while(scanf("%d",&r) && r!=0)  
    {  
        scanf("%d",&c);  
        memset(num,0,sizeof(num));  
        for(i=0;i<r;i++)  
            scanf("%s",buf[i]);  
        int m=1;  
        for(i=0;i<r;i++)  
        {  
            for(j=0;j<c;j++)  
            {  
                if(buf[i][j]=='*')//如果这个位置是黑格,不用填  
                    continue;  
                if((j-1)<0 || buf[i][j-1]=='*' || (i-1)<0 || buf[i-1][j]=='*')  
                {  //这个位置的上面或左面是黑格或是边界,开始往num填数字 
                    num[i][j]=m++;  
                }  
            }  
        }  
if(count!=1)
printf("\n");  //第一次不用换行,来处理每两个数据间一个空行,最后一个无空行 
        printf("puzzle #%d:\n",count++);  
        printf("Across\n");//接下来开始打印横行  
        for(i=0;i<r;i++)    
        {  
            int j=0;  
            while(j<c)  
            {  
                if(num[i][j] == 0 || buf[i][j] =='*')  
                {  
                    j++;  //如果这是个黑格或是中间无值格,跳过这一次 
                    continue;  
                }     
                printf("%3d.%c",num[i][j],buf[i][j]);//格式需要  
                j++;  
                while(j<c && buf[i][j]!='*')//当输出到行结尾时结束或是黑格时  
                {  
                    printf("%c",buf[i][j]);  
                    j++;   
                }  
                printf("\n");  
            }  
        }  
        printf("Down\n");//接下来打印竖行  
        for(i=0;i<r;i++)    
        {  
            for(j=0;j<c;j++)  
            {  
                if(num[i][j] == 0 || buf[i][j]=='*')  
                    continue;   //如果这是个黑格或是中间无值格,跳过这一次 
                printf("%3d.%c",num[i][j],buf[i][j]);  
                num[i][j]=0;  
                int k=i+1;  
                while(k<r && buf[k][j]!='*') //当输出到行结尾时结束或是黑格时  
                {  
                    printf("%c",buf[k][j]);  
                    num[k][j]=0;  //将其中的数归0,这是为了完成上上个注释所在行的代码 
                    k++;  
                }  
                printf("\n");  
            }  
        }  
    }  
    return 0;  
}  
//本题主要是将两张表看待成一张表来分析,关键之处在与前期数值的标记,以及最后纵向数出的
//本题是典型的利用二维数组的水题, 计算不复杂,但要小心边界


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值