P5483题解
更新
修改了代码有误的地方。
题意简化
给定若干个表格,依照题目给定格式输出。
需要注意的地方
- 输出最后切勿有换行。
- 相邻两个表格间应加上的是英文逗号。
- 题目细节多,要仔细审题。
解法分析
按题意模拟即可。
首先定义好要用的变量。
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×输入最大列数)
接着处理读入。
思路:将其转换成题目中的表格形式,存储在
但它每行输入的是一行字符串,怎么办?简单,把里面的英文逗号看作分隔符,就可以把每个格子的内容剥离出来。记住最后记得把临时存储再存储一遍(因为最后没有分隔符)。
题目很会挖坑,它输入的每行格子数没告诉你,要统计出来。
提醒一下,二维数组下标中的一个参数是行,第二个参数才是列,与普通数对有区别。
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+=',';
这样就不用特判了。
最后输出。
思路:把
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;
}