文章标题

UVA232 纵横字谜的答案

题目:
输入一个r行c列的网格(r>=1,c<=10),黑格用’*’表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能除了网格边界),则称这个白格是一个起始格。
首先把所有网格按照从上到下、从左到右的顺序编号1.2.3·····

接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down),同理从第一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出样例如下:

Sample Input
2 2
AT
*O
6 7
AIM*DEN
*ME*ONE
UPON*TO
SO*ERIN
SA*OR
IES*DEA
0

Sample Output

puzzle #1:
Across
1.AT
3.O
Down
1.A
2.TO

puzzle #2:
Across
1.AIM
4.DEN
7.ME
8.ONE
9.UPON
11.TO
12.SO
13.ERIN
15.SA
17.OR
18.IES
19.DEA

Down
1.A
2.IMPOSE
3.MEO
4.DO
5.ENTIRE
6.NEON
9.US
10.NE
14.ROD
16.AS
18.I
20.A


分析:1.题目复杂看起来比较复杂,也比较长(打的是真的累#……#),但其实思路比较简单,只是需要注意下答案输出的格式。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char s[15][15],num[15][15];
    int r,c;
    while(scanf("%d",&r)&&r)
    {
        int tot=0;
        scanf("%d",&c);
        memset(s,0,sizeof(s));
        for(int i=0;i<c;i++)
            scanf("%s",s[i]);
        for(int i=0;i<r;i++)
        {
            for(int j=0;j<c;j++)
            {
                if(s[i][j]=='*')continue;
                if(s[i-1][j]=='*'||s[i][j-1]=='*'||(j-1)<0||(i-1)<0)
                {
                    num[i][j]=++tot;
                }
            }
        }
        printf("puzzle #1:\nAcross\n");
        for(int i=0;i<r;i++)
        {
            int j=0;
            while(j<c)
            {
                if(num[i][j]==0||s[i][j]=='*'){j++;continue;}
                printf("  %d.%c",num[i][j],s[i][j]);
                j++;
                while(j<c&&s[i][j]!='*')
                {
                    printf("%c",s[i][j]);
                    j++;
                }
                printf("\n");
            }
        }
        printf("Down\n");
         for(int j=0;j<c;j++)
        {
            int i=0;
            while(i<c)
            {
                if(num[i][j]==0||s[i][j]=='*'){i++;continue;}
                printf("  %d.%c",num[i][j],s[i][j]);
                i++;
                while(i<c&&s[i][j]!='*')
                {
                    printf("%c",s[i][j]);
                    i++;
                }
            }
            printf("\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值