1 条题解

  • 0
    @ 2025-8-24 22:11:14

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar lzqy_
    生而绚烂,璀璨如花。

    搬运于2025-08-24 22:11:14,当前版本为作者最后更新于2021-03-24 14:07:30,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

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

    变量名

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

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

    大致思路

    把最后输出的东西看做一个 llen×hlen\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;
    }
    

    祝大家 AC\text{AC} 愉快!

    • 1

    信息

    ID
    4480
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者