紫书刷题记录 UVa1593 代码对齐

不太喜欢这种题,可能是有点怕字符串吧!这题的难点主要在思路的转变,题目要求左对齐且尽量靠左,所以确定每一列的间隔就很重要了。可以把每一列的单词长度最大的那个挑出来作为间隔 比如第一列单词长度最大的abcde
那么就以6作为分隔(为什么不是5?因为单词之前至少要空一格)所以该列就以6作为分隔符,其他的以此类推,直接上代码:

#include
#include
#include
#include
#include
#include
#include
using namespace std;
vector<string>v[10001];//储存单词  
vector<int>lenc;//计算间隔 
int main()
{
	string str;
	int length=0;//行数; 
	while(getline(cin,str))
	{
		string s;
		stringstream ss(str);//这个是真的好用!!! 
		while(ss>>s)
		{
			v[length].push_back(s);// 储存每一行的单词; 
		}
		length++;
	}
	int c=0;//列 
    int mac=-1;//因为每一行的单词个数不同,所以要找出最大的单词数目,作为循环的终止条件 
    for(int i=0;i<length;i++)//找出最多的单词数; 
    {
        int len=v[i].size();
        if(len>mac)
        mac=len;
	}
	while(c<mac)//这个循环是找每一列!是列!找出该列中长度最大的单词作为分隔 
	{
		int r=0;
		int Max=-1;
		while(r<length)
		{
			if(c>v[r].size()-1)
			r++;
			else
			{
				int len=v[r][c].size();
				if(len>Max)
				Max=len;
				r++;
			}
		}
		lenc.push_back(Max+1);//因为每两个单词之前最少一个空格 
		c++;
	}
    for(int i=0;i<length;i++)
	{
		for(int j=0;j<v[i].size();j++)
		{
			int len=lenc[j];
			if(j==v[i].size()-1)
			cout<<v[i][j]<<endl;
			else
			{
			cout<<setiosflags(ios::left); 
			cout<<setw(len)<<v[i][j]; 
		    }
		}
	}
	return 0;
}

你可能感兴趣的:(紫书刷题记录,c++,开发语言,后端)