UVA232字符串处理
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int rr,cc; char s[100][100]; int num[100][100]; bool border(int x,int y){ if(x>=0&&x<rr&&y>=0&&y<cc) return true; return false; } int Move[2][2]={{0,-1},{-1,0}}; bool check(int x,int y){ if(s[x][y]=='*') return false; for(int i=0;i<2;++i){ int tx=x+Move[i][0]; int ty=y+Move[i][1]; if(!border(tx,ty)) return true; if(s[tx][ty]=='*') return true; } return false; } char b[200][200]; char c[200][200]; char temp[200]; int B[200],C[200]; int main(){ int cas=0; while(scanf("%d",&rr),rr){ memset(num,0,sizeof(num)); if(cas) printf("\n"); scanf("%d",&cc); int i,j,y=0; for(i=0;i<rr;++i){ scanf("%s",s[i]); } for(i=0;i<rr;++i){ for(j=0;j<cc;++j){ if(check(i,j)){ num[i][j]=++y; } } } int p=0,q=0; for(i=0;i<rr;++i){ int k=0; for(j=0;j<cc;++j){ // printf("s%d%d:%c check:%d\n",i,j,s[i][j],check(i,j)); if(num[i][j]){ b[p][k++]=s[i][j]; if(k==1) B[p]=num[i][j]; int t=j+1; while(t<cc&&s[i][t]!='*'){ b[p][k++]=s[i][t]; t++; } b[p][k]='\0'; p++;k=0; j=t; } } } for(j=0;j<cc;++j){ int k=0; for(i=0;i<rr;++i){ if(num[i][j]){ c[q][k++]=s[i][j]; if(k==1) C[q]=num[i][j]; int t=i+1; while(t<rr&&s[t][j]!='*'){ c[q][k++]=s[t][j]; t++; } c[q][k]='\0'; q++;k=0; i=t; } } } printf("puzzle #%d:\n",++cas); printf("Across\n"); for(i=0;i<p;++i){ printf("%3d.%s\n",B[i],b[i]); } printf("Down\n"); for(i=0;i<q;++i){ for(j=0;j<q-1;++j){ if(C[j+1]<C[j]){ swap(C[j+1],C[j]); int cnt=0; int len1=strlen(c[j]); int len2=strlen(c[j+1]); for(p=0;p<len1;++p){ temp[cnt++]=c[j][p]; } temp[cnt]='\0'; cnt=0; for(p=0;p<len2;++p){ c[j][cnt++]=c[j+1][p]; } c[j][cnt]='\0'; cnt=0; for(p=0;p<len1;++p){ c[j+1][cnt++]=temp[p]; } c[j+1][cnt]='\0'; } } } for(i=0;i<q;++i){ printf("%3d.%s\n",C[i],c[i]); } } return 0; }
这个题有几个点需要注意。。第一。。字符串以'\0'结尾。。不要开小数组。。
第二对齐输出格式。。仔细对照会发现是%3d
while循环里面t忘记++
down list的word的含义理解错误。。标号仍然用第一次标的
down list需要从小到大输出。。我冒泡了一下。。
存储标号的num数组每次都要memset
记录完,k要记得归零
两个output之间要有一个空行。。
最后的output后面没有空行
小心数组越界。。
如果数据非常大。。并且。。单个字母是一个输出。。
那么我们b[20][20]显然不够。。
肯定要大于20的。。c数组也是。。。这个题主要错在了考察
这个地方。。
我们也可以边找边输出。。
但是c数组怎么处理呢。。。