P5483题解

· · 题解

更新

修改了代码有误的地方。

题意简化

给定若干个表格,依照题目给定格式输出。

需要注意的地方

  1. 输出最后切勿有换行。
  2. 相邻两个表格间应加上的是英文逗号。
  3. 题目细节多,要仔细审题。

解法分析

按题意模拟即可。

首先定义好要用的变量。

int n,m;//题目中的意思:n个表格,分别有m行 
int start_lie=1//目前从第start_lie列开始操作*/;
int tmp;//临时存储1(下面会讲其作用) 
string tmp2;//临时存储2(下面会讲其作用) 
int max_lie//最大列数
int max_hang;//最大行数
string title/*标题*/,in/*表格的每一行输入*/;
string ans[105][105*105];//答案(行数:最大n;列数:最大m×输入最大列数) 

接着处理读入。

思路:将其转换成题目中的表格形式,存储在 ans 里。

但它每行输入的是一行字符串,怎么办?简单,把里面的英文逗号看作分隔符,就可以把每个格子的内容剥离出来。记住最后记得把临时存储再存储一遍(因为最后没有分隔符)。

题目很会挖坑,它输入的每行格子数没告诉你,要统计出来。

提醒一下,二维数组下标中的一个参数是行,第二个参数才是列,与普通数对有区别。

cin>>n;
for(int i=1;i<=n;i++){
    cin>>m>>title;//title:每个表格标题
    ans[0][start_lie]=title;//存下标题,存在第0行第开始操作列 
    max_lie=0//该表格最大列数初始化;
    if(m>max_hang) max_hang=m;
    for(int j=1;j<=m;j++){
        cin>>in;//获得每行内容
        tmp2="";//临时存储每一个格子的内容(初始化)
        tmp=0/*格子数(初始化)*/;
        for(int k=0;k<in.size();k++){//剥离每个格子
            if(in[k]==','){//到逗号就把记录的格子内容保存下来
                tmp++;
                ans[j][start_lie+tmp-1]=tmp2;
                tmp2="";
            }
            else{
                tmp2+=in[k];
            }
        }
        tmp++;
        ans[j][start_lie+tmp-1]=tmp2;
        tmp2="";
        if(tmp>max_lie) max_lie=tmp;//更新最大列数
    }
    start_lie+=max_lie;//更新开始操作的列
}

其实还有一种不用上述特判的方法,在每行末尾加上英文逗号,也就是补上分隔符。

可以这样写:

cin>>in;
in+=',';

这样就不用特判了。

最后输出。

思路:把 ans 数组打出来一遍就行,但注意格式,上面讲了,看需要注意的地方这部分。

for(int i=0;i<=max_hang;i++){//注意:标题存在第零行
    for(int j=1;j<=start_lie-1;j++){
        cout<<ans[i][j];
        if(j!=start_lie-1)cout<<",";//特判2:行末没有逗号
    }
    if(i!=max_hang)cout<<endl;//特判3:输出最后没换行
}

最后说一句,我比较推荐万能头文件,这样可以省去很多不必要的麻烦。

完整代码

//已通过
#include<bits/stdc++.h>
//万能头文件
using namespace std;
int n,m;//题目中的意思:n个表格,分别有m行 
int start_lie=1//目前从第start_lie列开始操作*/;
int tmp;//临时存储1(下面会讲其作用) 
string tmp2;//临时存储2(下面会讲其作用) 
int max_lie//最大列数
int max_hang;//最大行数
string title/*标题*/,in/*表格的每一行输入*/;
string ans[105][105*105];//答案(行数:最大n;列数:最大m×输入最大列数) 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>m>>title;//title:每个表格标题
        ans[0][start_lie]=title;//存下标题,存在第0行第开始操作列 
        max_lie=0//该表格最大列数初始化;
        if(m>max_hang) max_hang=m;
        for(int j=1;j<=m;j++){
            cin>>in;//获得每行内容
            tmp2="";//临时存储每一个格子的内容(初始化)
            tmp=0/*格子数(初始化)*/;
            for(int k=0;k<in.size();k++){//剥离每个格子
                if(in[k]==','){//到逗号就把记录的格子内容保存下来
                    tmp++;
                    ans[j][start_lie+tmp-1]=tmp2;
                    tmp2="";
                }
                else{
                    tmp2+=in[k];
                }
            }
            tmp++;
            ans[j][start_lie+tmp-1]=tmp2;
            tmp2="";
            if(tmp>max_lie) max_lie=tmp;//更新最大列数
        }
        start_lie+=max_lie;//更新开始操作的列
    }
    for(int i=0;i<=max_hang;i++){//注意:标题存在第零行
        for(int j=1;j<=start_lie-1;j++){
            cout<<ans[i][j];
            if(j!=start_lie-1)cout<<",";//特判1:行末没有逗号
        }
        if(i!=max_hang)cout<<endl;//特判2:输出最后没换行
    }
    return 0;
}