首页 > 试题广场 >

绘制括号序列

[问答题]

绘制括号序列

题目描述垂直绘制一个中括号的序列 并用中括号的大小表示层次关系绘制 [[[]]][] 这个括号序列

如图:

+-----+

|+---+|

|+-+|

| |

| |

|+-+|

|+---+|

+-----+

+-----+

|     |

|     |

+-----+

绘图遵守以下原则:

各个括号之间没有空格 只有在左右括号在最里层配对时 中间才会有一条空行

里层的括号必定小于外层的括号

同一层次的括号大小相同(比如上述的样例 最下面的括号和上面的大括号相同大小)

输入

一个以括号组成的字符串

输出

绘制的图形 保证括号匹配序列合法

样例输入:

[][][]

样例输出:

+-+

| |

| |

+-+

+-+

| |

| |

+-+

+-+

| |

| |

+-+

数据范围:

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;  
}  
编辑于 2017-07-28 16:52:53 回复(0)