即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

UVa 232 Crossword Answers

编程语言 bbbbswbq 20℃ 0评论

Problem Description

输入一个r行c列(1<=r, c<=10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。


首先把所有起始格按照从上到下、从左到右的顺序编号1,2,3……,


接下来要找出所有横向单词。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词。这些档次必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。

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

代码:

#include
using namespace std;
struct node
{
    int data;
    int num;
};
int main()
{
    int n, m;
    char s[15][15];
    int i, j;
    node a[15][15];
    int cas = 1;
    while(~scanf("%d", &n))
    {
        if(!n) break;//为0退出循环
        scanf("%d", &m);
        memset(a, 0, sizeof(a));
        for(i = 0; i < n; i++)//n,m列 初始化结构体
        {
            for(j = 0; j < m; j++)
            {
                a[i][j].data = 0;
                a[i][j].num = 0;
            }
        }
        for(i = 0; i < n; i++)
        {
            scanf("%s", s[i]);//输出n行
        }
        int flag = 1;//起始点的编号
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < m; j++)
            {
                if(s[i][j] != '*')
                {
                    if(i - 1 >= 0 && i - 1 < n)//上边有障碍物
                    //data为1
                    {
                        if(s[i-1][j] == '*') {
                            a[i][j].num = flag++;
                            a[i][j].data = 1;
                        }
                    }
                    else {
                        a[i][j].num = flag++;
                        a[i][j].data = 1;
                    }
                    if(j - 1 >= 0 && j - 1 < m)//左边有障碍物
                    //data 为3,如果左边上边都有data为2
                    {
                        if(s[i][j - 1] == '*' && a[i][j].data) {
                            a[i][j].data = 3;
                        }
                        else if(s[i][j - 1] == '*')
                        {
                            a[i][j].num = flag++;
                            a[i][j].data = 2;
                        }
                    }
                    else if(a[i][j].data) {
                        a[i][j].data = 3;
                    }
                    else {
                        a[i][j].num = flag++;
                        a[i][j].data = 2;
                    }
                }
            }
        }
        int k;
        if(cas != 1) printf("\n");
        printf("puzzle #%d:\n", cas++);
        printf("Across\n");//横向
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < m; j++)
            {
                if(a[i][j].data == 2 || a[i][j].data == 3)//左边有障碍物
                {
                    printf("%3d.", a[i][j].num);
                    for(k = j; k < m; k++)
                    {
                        if(s[i][k] != '*') printf("%c", s[i][k]);
                        else break;
                    }
                    printf("\n");
                }
            }
        }
        printf("Down\n");
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < m; j++)
            {
                if(a[i][j].data == 1 || a[i][j].data == 3)//上边有障碍物
                {
                    printf("%3d.", a[i][j].num);
                    for(k = i; k < n; k++)
                    {
                        if(s[k][j] != '*') printf("%c", s[k][j]);
                        else break;
                    }
                    printf("\n");
                }
            }
        }
    }
}

转载请注明:CodingBlog » UVa 232 Crossword Answers

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情