题解P5483[JLOI2011]小A的烦恼((逗号真的坑啊

· · 题解

这是一道很难受的模拟

语文不好
题意都理解了很久

题目传送门

这是一篇很正经的题解~~~
进入正题

感觉容易忽略的地方

总的来说就是逗号有坑

大概讲解一下本蒟蒻的变量名

int变量

maxn 所有文件中最大排数((要输出的排数

num[i][j] 第i个文件第j行逗号的数量

n[i] 每个文件的排数

max_num[i] 每个模块,对于所有排,逗号的最大个数

char变量

nam[i][] 第i个文件的文件名

h[i][j][] 存字符串,第i个模块的第j行

然后咱可以开始模拟了!!

先读入

for(int i=1;i<=T;i++){
    scanf("%d",&n[i]);
    maxn=max(n[i],maxn);
    //对于所有的文件,要输出的排数就是所有文件里最大的排数
    scanf("%s",nam[i]+1);
    for(int j=1;j<=n[i];j++){
        scanf("%s",th[i][j]+1);
        int len=strlen(th[i][j]+1);
        //因为每个字符串的长度只用一次,可以不用存下来,直接覆盖就好
        for(int k=1;k<=len;k++){
            if(th[i][j][k]==',') num[i][j]++;
            //统计每一个文件的每一排有多少个逗号
        }
        max_num[i]=max(max_num[i],num[i][j]);
        //统计每一个文件,对于所有排,最大的逗号数
        //当文件名或某一行后面需要补充逗号时,根据max_num[i]来补充
    }
}

然后输出

//为了方便输出,也可以先进行处理
//但本蒟蒻觉得麻烦
//就边输出边处理~~~
for(int i=1;i<=T;i++){
    printf("%s",nam[i]+1);
    for(int k=1;k<=max_num[i];k++) printf(",");
    //补充逗号
    //只要文件不是一列,那么就需要补充逗号
    //若文件为一列,max_num[i]=0
    //补充逗号的数量由max_num[i]((最大逗号数))来决定
    if(i!=T) printf(",");
    //若该文件不是最后一个文件,那么需要输出逗号隔开
}
for(int j=1;j<=maxn;j++){//每一排输出了之后,再输出下一排
    for(int i=1;i<=T;i++){
        if(n[i]<j) for(int k=1;k<=max_num[i];k++) printf(",");
        //某个文件的排数小于正在输出的排数
        //那么这个文件从这一排开始,下面都没有内容
        //如果某个文件这一排没有内容,补充逗号
        else{
            printf("%s",th[i][j]+1);
            //若有内容,输出字符串
            if(num[i][j]<max_num[i]){
                int x=max_num[i]-num[i][j];
                for(int k=1;k<=x;k++) printf(",");
            }
            //若某个文件的这一排的长度<该文件所有排中最大长度
            //输出逗号来补充
        }
        if(i!=T) printf(",");
        //若该文件不是最后一个文件,那么需要输出逗号隔开
    }
    printf("\n");
}

最后附上AC代码~~~

#include<bits/stdc++.h>
using namespace std;

int T;
int maxn;//maxn所有模块中最大排数
int num[107][107];//num[i][j]第i个模块第j行逗号的数量 
int n[107];//n[i]每个模块的排数
char nam[107][107];//nam[i][]第i个模块的文件名 
char th[107][107][107];//th[i][j][]存字符串,第i个模块的第j行 
int max_num[107];//max_num[i]每个模块逗号的个数 
//i 模块
//j 排数 

int main(){
    scanf("%d",&T);
    for(int i=1;i<=T;i++){
        scanf("%d",&n[i]);
        maxn=max(n[i],maxn);
        scanf("%s",nam[i]+1);
        for(int j=1;j<=n[i];j++){
            scanf("%s",th[i][j]+1);
            int len=strlen(th[i][j]+1);
            for(int k=1;k<=len;k++) if(th[i][j][k]==',') num[i][j]++;
            max_num[i]=max(max_num[i],num[i][j]);
        }
    }

    for(int i=1;i<=T;i++){
        printf("%s",nam[i]+1);
        for(int k=1;k<=max_num[i];k++) printf(",");
        if(i!=T) printf(",");
    }
    //输出文件名 

    printf("\n");

    for(int j=1;j<=maxn;j++){
        for(int i=1;i<=T;i++){
            if(n[i]<j) for(int k=1;k<=max_num[i];k++) printf(",");
            else{
                printf("%s",th[i][j]+1);
                if(num[i][j]<max_num[i]){
                    int x=max_num[i]-num[i][j];
                    for(int k=1;k<=x;k++) printf(",");
                }
            }
            if(i!=T) printf(",");
        }
        printf("\n");
    }
    return 0;
} 

第一次写题解啊啊啊

一定要过啊啊