UVA232-纵横字谜的答案
题目:https://vjudge.net/problem/UVA-232
分析:在输入的同时用序号对起始格标记,然后按照输出要求输出即可。
注意:1.行和列的单词要按照序号从小到大输出。
2.每行的单词首字母左边不能有白格,每列的单词首字母上边不能有白格。
3.本题最后一个样例末尾没有空行。
4.输入的时候每一行最后可能有换行。
1 #include <stdio.h> 2 #include <string.h> 3 int main(void){ 4 int l,w;//l表示矩阵行数,w表示矩阵宽度 5 char c[11][13]; 6 int f[11][13]; 7 int k=0; 8 while(scanf("%d",&l)==1&&l){ 9 int t=1; 10 scanf("%d",&w); 11 memset(c,'\0',sizeof(c)); 12 memset(f,0,sizeof(f)); 13 for(int i=1;i<=l;i++){ 14 for(int j=1;j<=w;j++){//输入可以用字符串输入,但为了边读边做选择逐个字符读入 15 scanf("%c",&c[i][j]); 16 if(c[i][j]==' '||c[i][j]=='\n')//处理行末的空格或换行 17 scanf("%c",&c[i][j]); 18 if((i-1==0||j-1==0)&&c[i][j]!='*'){ 19 f[i][j]=t; 20 t++; 21 } 22 else if((c[i-1][j]=='*'||c[i][j-1]=='*')&&f[i][j]==0&&c[i][j]!='*'){ 23 f[i][j]=t; 24 t++; 25 } 26 } 27 } 28 if(k)printf("\n"); 29 printf("puzzle #%d:\nAcross\n",++k);//输出行的单词 30 for(int i=1;i<=l;i++){ 31 for(int j=1;j<=w;){ 32 if(f[i][j]!=0){ 33 printf("%3d.",f[i][j]); 34 while(c[i][j]!='*'&&j<=w){ 35 printf("%c",c[i][j]); 36 j++; 37 } 38 printf("\n"); 39 } 40 j++; 41 } 42 } 43 printf("Down\n");//输出列的单词 44 for(int i=1;i<=l;i++){ 45 for(int j=1;j<=w;j++){ 46 if(f[i][j]!=0&&(c[i-1][j]=='*'||i-1==0)){ 47 int h=i; 48 printf("%3d.",f[i][j]); 49 while(c[h][j]!='*'&&h<=l){ 50 printf("%c",c[h][j]); 51 h++; 52 } 53 printf("\n"); 54 } 55 } 56 } 57 } 58 return 0; 59 }
终究独木难支。