P5483 [JLOI2011]小A的烦恼 题解

· · 题解

提供一个简单的方法,大括号换行代码 29

这道题没有什么难度,就是纯模拟,结合代码来分析就好了

变量名

先来解释一下接下来代码的变量名:

int N;//总行数
int hlen,llen;
//hlen:每一行的长度(总列数)   llen:每一列的长度(总行数)
int Max,cnt,n;//临时变量
string ans[1001][1001];
//ans[i][j]:最后输出的表格中,(i,j)位置上的字符串(如果没有就为空)
string s;//临时变量

大致思路

把最后输出的东西看做一个 \text{llen}\times \text{hlen} 的矩阵,用数组存下,并把逗号看做平常输出矩阵的空格,这样一来,逗号、行数等很多的细节就没有了。

代码

在代码里有非常详细的注释~

#include<bits/stdc++.h>
using namespace std;
int N,n,hlen,llen,Max,cnt;
string ans[1001][1001],s;
//上文已经介绍
int main()
{
    cin>>N;
    for(int i=1;i<=N;i++)
    {
        cin>>n>>ans[1][++hlen];
        //新的文件要往右边排
        //因此这个文件的文件名位于(1,hlen+1)位置(顺便更新hlen)
        llen=max(llen,n+1),Max=0;
        //这一个文件一定有n+1行(算上文件名那一行),刷新llen
        for(int j=1;j<=n;j++)
        {
            cin>>s,cnt=0;
            //依次读入第j+1行第cnt个子文件
            for(int u=0;u<s.length();u++,cnt++)
                while(s[u]!=','&&u<s.length())  
                    ans[j+1][hlen+cnt]+=s[u++];
            Max=max(Max,cnt-1);
            //这里的Max代表目前文件每一行子文件个数的最大值
            //也就是说,目前的文件会使列数多出几列
        }
        hlen+=Max;//累加列数
    }
    //最后输出整个llem×hlen的矩阵就好了
    for(int i=1;i<=llen;i++)
        for(int j=1;j<hlen;j++)
            if(j!=hlen)
                cout<<ans[i][j]<<',';
            else 
                cout<<ans[i][hlen]<<endl;
    return 0;
}

祝大家 \text{AC} 愉快!