算法竞赛入门经典(第二版) 习题3-6 Crossword Answers UVa232 Finals1994

来源:互联网 发布:单片机的32个引脚介绍 编辑:程序博客网 时间:2024/05/17 07:32

Page 58

Description


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


此题不难,但我还是被坑了Orz

错误的原因依旧是输出格式,此题要考虑没有横起始点或没有竖起始点的情况。

例如输入样例:

2 2
**
**

则输出应为:

puzzle #1:
Across
Down

中间不应有空格。

下面注释里为原来错误的代码。

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cctype>#include<cmath>using namespace std;#define maxn 12char s[maxn][maxn];int ss[maxn][maxn];int main(){    //freopen("in.txt","r",stdin);    int i,j,m,n,cas=0;    while(scanf("%d %d",&m,&n)==2){        memset(ss,0,sizeof(ss));        int bianhao=0;                                      //int bianhao=0,cnt1=0,cnt2=0;        for(i=0;i<m;i++) scanf("%s",s[i]);        if(cas>0) printf("\n");        printf("puzzle #%d:\nAcross",++cas);               //printf("puzzle #%d:\nAcross\n",++cas);        for(i=0;i<m;i++)            for(j=0;j<n;j++)                if(s[i][j]!='*'&&(i==0||j==0||s[i-1][j]=='*'||s[i][j-1]=='*')) ss[i][j]=++bianhao;        for(i=0;i<m;i++)            for(j=0;j<n;j++){                if(ss[i][j]>0&&(j==0||s[i][j-1]=='*')){          //横起始点                    printf("\n%3d.%c",ss[i][j],s[i][j]);//if(cnt1>0) printf("\n"); else cnt1=1;  printf("%3d.%c",ss[i][j],s[i][j]);                }                else if(s[i][j]!='*') printf("%c",s[i][j]);            }        printf("\nDown");                                    //printf("\nDown\n");        for(i=0;i<m;i++)            for(j=0;j<n;j++){                if(ss[i][j]>0&&(i==0||s[i-1][j]=='*')){         //竖起始点                    printf("\n%3d.%c",ss[i][j],s[i][j]);//if(cnt2>0) printf("\n"); else cnt2=1;  printf("%3d.%c",ss[i][j],s[i][j]);                    int a=1;                    while((i+a<m)&&(s[i+a][j]!='*')) {printf("%c",s[i+a][j]);a++;}                }            }        printf("\n");    }    return 0;}


0 0