绘制括号序列
【题目描述】垂直绘制一个中括号的序列 并用中括号的大小表示层次关系绘制 [[[]]][] 这个括号序列
如图:
+-----+
|+---+|
|+-+|
| |
| |
|+-+|
|+---+|
+-----+
+-----+
| |
| |
+-----+
绘图遵守以下原则:
各个括号之间没有空格 只有在左右括号在最里层配对时 中间才会有一条空行
里层的括号必定小于外层的括号
同一层次的括号大小相同(比如上述的样例 最下面的括号和上面的大括号相同大小)
输入
一个以括号组成的字符串
输出
绘制的图形 保证括号匹配序列合法
样例输入:
[][][]
样例输出:
+-+
| |
| |
+-+
+-+
| |
| |
+-+
+-+
| |
| |
+-+
数据范围:
30%的数据 括号层数只有1
100%的数据 括号层数 <= 6
100%的数据 字符串长度 <= 100

#include <bits/stdc++.h> using namespace std; int main() { string str; cin >> str; if(str.size() == 0) return 0; vector<int> level(str.size(), 0); int l = 0; int maxL = 0; for (int i = 0; i < str.size(); ++i) { if (str[i] == '[') { ++l; level[i] = l; if (l > maxL) maxL = l; } if (str[i] == ']') { level[i] = l; --l; } } for (int i = 0; i < str.size(); ++i) level[i] = maxL - level[i]; --maxL; for (int i = 0; i < str.size(); ++i) { if (str[i] == '[') { if (level[i] == maxL || level[i] == level[i-1]) { for (int j = 0; j < (2 * maxL - 2 * level[i]) / 2; ++j) cout << ' '; cout << '+'; for (int k = 0; k < 2 * level[i] + 1; ++k) cout << '-'; cout << '+'; for (int j = 0; j < (2 * maxL - 2 * level[i]) / 2; ++j) cout << ' '; cout << endl; } else { for (int j = 0; j < (2 * maxL - 2 * level[i] - 2)/2; ++j) cout << ' '; cout << "|+"; for (int j = 0; j < (2 * level[i] + 1); ++j) cout << '-'; cout << "+|"; for (int j = 0; j < (2 * maxL - 2 * level[i] - 2) / 2; ++j) cout << ' '; cout << endl; } if (level[i] == level[i + 1]) { for (int j = 0; j < (2 * maxL - 2 * level[i]) / 2; ++j) cout << " "; cout << "|"; for (int j = 0; j < 2 * level[i] + 1; ++j) cout << " "; cout << "|"; for (int j = 0; j < (2 * maxL - 2 * level[i]) / 2; ++j) cout << " "; cout << endl; for (int j = 0; j < 2 * maxL + 3; ++j) cout << " "; cout << endl; } } else if (str[i] == ']') { if (level[i] == level[i - 1]) { for (int j = 0; j < (2 * maxL - 2 * level[i]) / 2; ++j) cout << " "; cout << "|"; for (int j = 0; j < 2 * level[i] + 1; ++j) cout << " "; cout << "|"; for (int j = 0; j < (2 * maxL - 2 * level[i]) / 2; ++j) cout << " "; cout << endl; } if (level[i] == maxL || level[i] == level[i+1]) { for (int j = 0; j < (2 * maxL - 2 * level[i]) / 2; ++j) cout << ' '; cout << '+'; for (int k = 0; k < 2 * level[i] + 1; ++k) cout << '-'; cout << '+'; for (int j = 0; j < (2 * maxL - 2 * level[i]) / 2; ++j) cout << ' '; cout << endl; } else { for (int j = 0; j < (2 * maxL - 2 * level[i] - 2) / 2; ++j) cout << ' '; cout << "|+"; for (int j = 0; j < (2 * level[i] + 1); ++j) cout << '-'; cout << "+|"; cout << endl; } } } return 0; }