小z想和小y愉快的玩耍,但是小y在写程序。程序写好了,但是小y怎么调试也过不了。小z帮小y看了一下就不想看了,因为小y虽然是萌妹子,但是她的程序缩进实在是不忍直视。于是小z决定帮她纠正。
程序里的每一行语句分为单词和空格,ASCII码从33到126的一段连续字符串是单词,而单词之间由ASCII码为32的空格分开。小z的缩进方法具体来说是这样:对于每一行的第 i 个单词,它的第一个字符的位置不能小于其它每一行的第 1 至第 i−1 个单词,且每个单词的位置要尽量靠前。例如,一段代码:
__start:__integer;____//_begins_here
stop:_integer;_//__ends_here__
_s:__string;___
c:___char;_//_temp_
经过小z的缩进方法,就变成了下面这样:
start:_integer;_//_begins_here
stop:__integer;_//_ends___here
s:_____string;
c:_____char;____//_temp
为了方便大家阅读,这里的下划线代表空格。当然要注意的是,实际上你的程序处理下划线的时候还是要将它作为单词的一部分处理。
为了能早点和小y出去玩,小z决定弄一个程序来帮助小y。当然,这个任务就交给你了。
输入数据的第一行是一个整数 T(T≤15) ,表示测试数据数目。随后包含 T 个测试数据。每个测试数据包含若干行,每一行至少包括一个单词,单词的长度不超过80,且单词间用若干个空格来隔开。每一行都可能有前缀空格和后缀空格。每一行的长度不超过180。一个测试数据的结尾用一行单独的@字符来表示。
对于每个测试数据,你应该输出同等于这个测试数据的行数行。
1
start: integer; // begins here
stop: integer; // ends here
s: string;
c: char; // temp
@
start: integer; // begins here stop: integer; // ends here s: string; c: char // temp
我的想法是把整个处理后的代码认为是一个表格,行数就是输入的行数,列数是所有行中单词最多的个数.
然后每一列的宽度设置为 当前列的单词中最长的那个单词的长度,然后输出即可~
这里getline之后把一个string分割成几个单词有一个非常方便的方法就是 istringstream的应用.
因为分隔符是空格,所以非常简单,而且也支持流运算符
代码如下,核心是单词的控制!
#include <iostream> #include <cstring> #include <vector> #include <sstream> using namespace std; string lines[10000];//存储每一行的原话 vector<string> words[10000];//每一个元素是一个vector 存的是当前行的单词列表 int col_len = 0;//表示一行里 最多的单词数 int line_len = 0; int col_longest[10000]; inline int getMax(int a,int b){ return a > b ? a : b; } void split(string &str, vector<string> &ws){ istringstream iss(str); do{ string word; iss>>word; ws.push_back(word); }while(iss); ws.pop_back(); //cout<<ws.size()<<endl; col_len = getMax(col_len,ws.size()); } void print_blank(int n){ for (int i = 0; i < n; ++i) { cout<<" "; } return; } int main(int argc, char const *argv[]) { int N; cin>>N;//N组数据 for(int k = 0; k < N ; ++k){ col_len = 0 , line_len = 0;//初始化 string input; memset(col_longest,0,sizeof(col_longest)); memset(words,0,sizeof(col_longest)); getline(cin,input); //输入第一行 while(input!="@"){ if(input!="") lines[line_len++] = input; getline(cin,input); } //分割单词 并存入单词表 for (int i = 0; i < line_len; ++i) split(lines[i],words[i]); //记录每一列的长度 = 当前列的单词最大长度 for (int i = 0; i < col_len; ++i) { int maxLen = 0; for (int j = 0; j < line_len; ++j) if( i < words[j].size() ) { maxLen = getMax(maxLen,words[j][i].size()); } col_longest[i] = maxLen; } // for (int i = 0; i < col_len; ++i) // { // cout<<col_longest[i]<<" "; // }cout<<endl; //输出结果 for (int i = 0; i < line_len; ++i) { for (int j = 0; j < words[i].size(); ++j) { cout<<words[i][j]<<" "; //补齐空格 print_blank(col_longest[j]-words[i][j].size()); } cout<<endl; } } return 0; }
【算法学习笔记】39.字符串处理 单词分割 SJTU OJ 1302 缩进格式
原文:http://www.cnblogs.com/yuchenlin/p/sjtu_oj_1302.html