题目不难,思路也很好想出,但仍然花费了很长时间,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; }