题目描述题目要求将使用伪图形字符绘制的表格进行自动对齐。表格由横线-ASCII 196\texttt{ASCII 196}ASCII 196、竖线|ASCII 179\texttt{ASCII 179}ASCII 179和角点字符如┌、┐、└、┘、┬、┴、┼、├、┤等组成。表格中的单元格文本可能分布在多行中。对齐后每个单元格的内容与左右竖线之间应满足左边恰好一个空格右边至少一个空格。目标是使表格的总宽度即每行长度最小化。输入格式第一行一个整数MMM表示数据集的个数后面跟一个空行。每个数据集包含一个已编辑的表格表格行数不超过100100100每行长度不超过255255255字符。输入行本身不含前导和尾随空格也不含空行。两个连续数据集之间由一个空行分隔。输出格式对于每个数据集输出对齐后的表格。输出行不应包含前导和尾随空格也不应有空行。格式化后表格的宽度不超过255255255字符。两个连续数据集的输出之间由一个空行分隔。样例输入1 ┌───────────────┬─────────────┬────────────────────────────────────────┐ │Name │Organization │JOB │ ├───────────────┼─────────────┼────────────────────────────────────────┤ │Bill Clinton │USA │The President of the United States │ │Bill Gates │Microsoft Corporation│President │ │Bill Poucher │A C M │International Collegiate Programming Contest Director│ └───────────────┴─────────────┴────────────────────────────────────────┘输出┌──────────────┬──────────────────────┬────────────────────────────────────────────────────────────┐ │Name │Organization │JOB │ ├──────────────┼──────────────────────┼────────────────────────────────────────────────────────────┤ │Bill Clinton │USA │The President of the United States │ │Bill Gates │Microsoft Corporation │President │ │Bill Poucher │A C M │International Collegiate Programming Contest Director │ └──────────────┴──────────────────────┴────────────────────────────────────────────────────────────┘题目分析本题的核心是解析由伪图形字符构成的表格计算每列所需的最小宽度然后重新绘制表格。表格结构表格由以下字符构成横线-ASCII 196\texttt{ASCII 196}ASCII 196竖线|ASCII 179\texttt{ASCII 179}ASCII 179十字交叉点┼ASCII 197\texttt{ASCII 197}ASCII 197角点┌218\texttt{218}218、┐191\texttt{191}191、└192\texttt{192}192、┘217\texttt{217}217三叉连接┬194\texttt{194}194、┴193\texttt{193}193、├195\texttt{195}195、┤180\texttt{180}180表格的第一行以┌开始最后一行以└开始。中间的行以├或|开始。列宽计算表格中每列由竖线分隔竖线之间的内容为单元格文本。单元格文本可能分布在多行中。对于每列需要找出该列所有单元格中非空内容的最大宽度去除前导和尾随空格后的长度。最终列宽即为该最大宽度。对齐规则每个单元格内容与左侧竖线之间恰好有一个空格。每个单元格内容与右侧竖线之间至少有一个空格即右侧填充空格数量为列宽 - 内容长度 1。为最小化表格总宽度每列宽度取该列所有单元格内容的最大长度。绘制表格根据计算出的列宽重新绘制表格绘制顶部边框┌ 若干-┬ … ┐绘制分隔行├ 若干-┼ … ┤绘制底部边框└ 若干-┴ … ┘绘制数据行| 空格 单元格内容 若干空格 | …算法步骤读取整个表格按行存储。扫描表格识别所有包含竖线的行即|开头的行解析每行的单元格内容。对于每列统计所有单元格内容去除前导和尾随空格后的长度取最大值作为该列宽度。根据列宽重新绘制表格绘制顶部边框。绘制数据行保留原始单元格内容的顺序。绘制分隔行根据原始表格中的分隔行位置决定是否绘制但题目要求保持原始行数不变实际上原始表格的每行包括横线行都应保留但横线行需根据新列宽重新绘制。输出结果。复杂度分析表格行数R≤100R \le 100R≤100列数C≤256C \le 256C≤256每行长度≤255\le 255≤255总复杂度O(R×C)O(R \times C)O(R×C)。代码实现// Table// UVa ID: 500// Verdict: Accepted// Submission Date: 2017-04-17// UVa Run Time: 0.100s//// 版权所有C2017邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;constcharseparator(char)(179),right_line_separator(char)(180),top_right_corner(char)(191),bottom_left_corner(char)(192),bottom_line_separator(char)(193),top_line_separator(char)(194),left_line_separator(char)(195),link(char)(196),middle_line_separator(char)(197),bottom_right_corner(char)(217),top_left_corner(char)(218);voiddrawLine(intcolumns,vectorintcolumnWidth,charleftChar,charmiddleChar,charrightChar){coutleftChar;for(inti0;icolumns;i){if(i0)coutmiddleChar;for(intj0;jcolumnWidth[i]2;j)coutlink;}coutrightChar\n;}voidprocess(vectorstringtable){vectorintcolumnWidth(256,0);intcolumns0;for(inti0;itable.size();i)if(table[i].front()separator){istringstreamiss(table[i].substr(1,table[i].length()-1));string block;intc0;while(getline(iss,block,separator)){intii0,jjblock.length()-1;while(iiblock.length()isblank(block[ii]))ii;while(jj0isblank(block[jj]))jj--;if(iijj)columnWidth[c]max(columnWidth[c],jj-ii1);c;}columnsc;}for(inti0;itable.size();i){if(table[i].front()top_left_corner)drawLine(columns,columnWidth,top_left_corner,top_line_separator,top_right_corner);if(table[i].front()bottom_left_corner)drawLine(columns,columnWidth,bottom_left_corner,bottom_line_separator,bottom_right_corner);if(table[i].front()left_line_separator)drawLine(columns,columnWidth,left_line_separator,middle_line_separator,right_line_separator);if(table[i].front()separator){istringstreamiss(table[i].substr(1,table[i].length()-1));string block;intc0;while(getline(iss,block,separator)){intii0,jjblock.length()-1;while(iiblock.length()isblank(block[ii]))ii;while(jj0isblank(block[jj]))jj--;if(iijj)blockblock.substr(ii,jj-ii1);elseblock.clear();coutseparator block;coutstring(columnWidth[c]1-block.length(), );c;}coutseparator\n;}}}intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);string line;getline(cin,line);intcasesstoi(line);getline(cin,line);for(intc1;ccases;c){if(c1)cout\n;vectorstringtable;while(getline(cin,line),line.length()0)table.push_back(line);process(table);}return0;}