UVa 232 - Crossword Answers

题目不难,思路也很好想出,但仍然花费了很长时间,WA很多次啊!!!    测试样例都过了,检查程序发现算法方面也没有问题,直到最后才发现丢了小写字母的情况,于是改了一下就AC了,本题收获主要有以下几点:

  1、多case问题,要记得用memset初始化数组,以免不同case之间相互影响。

  2、可以再另外设一个“标记数组”来标记某一个方格是否为起始格。

  3、关于输出格式的限定,按题目要求输出,比如该题就是除第一组数据外,以后每组数据在输入与输出之间有空格,最后无空格。

  4、 字母大小写问题。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
       int m,n,i,j,k,l,r,s,t,cixu=1;
       int num[20][20]={0};
       char a[20][20],b[20][20];
       while( scanf("%d",&m)  != EOF)
       {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            memset(num,0,sizeof(num));
            if( m == 0)
                break;
            scanf("%d",&n);
            getchar();
            for(i=0; i<m; i++)
                gets(a[i]);
            if(cixu != 1)
                printf("\n");
            printf("puzzle #%d:\n",cixu);    cixu++;
            for(i=0; i<m; i++)
                for(j=0; j<n; j++)
                    b[i][j]=a[i][j];
            r=1;
            for(i=0; i<m; i++)
                for(j=0; j<n; j++)
                    {if(   (b[i][j]>=65 && b[i][j]<=90) || ( b[i][j]>=97 && b[i][j]<=122  )      )
                        if( i-1<0 || j-1<0 || b[i-1][j]=='*' || b[i][j-1]=='*' )
                             num[i][j]=r++;}
            printf("Across\n");
            for(i=0; i<m; i++)
            {
                for(j=0; j<n; j++)
                {
                    if(num[i][j] != 0)
                    {
                        printf("%3d.",num[i][j]);
                        for(j;  j<n;  j++)
                        {
                            if( j < n && b[i][j] != '*')
                                printf("%c",b[i][j]);
                            if(b[i][j] == '*'  || j == n-1)
                            {
                                printf("\n");
                                break;
                            }

                        }

                    }

                }

            }
            printf("Down\n");
            for(i=0; i<m; i++)
            {
                for(j=0; j<n; j++)
                {
                    k=i;
                    if(num[i][j] != 0 )
                    {
                        printf("%3d.",num[i][j]);     num[i][j] = 0;
                        for(k; k<m; k++)
                        {
                            if(k<m && b[k][j] != '*')
                            {
                                printf("%c",b[k][j]);
                                num[k][j]=0;
                            }
                            if(k == m-1 || b[k][j] == '*')
                            {
                                printf("\n");
                                break;
                            }

                        }

                    }

                }

            }

        }

        return 0;
}


你可能感兴趣的:(UVa 232 - Crossword Answers)