UVA232字符串处理

时间:2023-01-07 11:27:11
#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数组怎么处理呢。。。