题目
数据
1234567890qwertyuiopasdfghjklzxcvbnm
314159265358979323864626433832795028841971693993751058209749445923078164062862
111aaaaa2222bcCDefFG,#$%6767df~`wejkwh\|}{dshujdiuewSFDESGf4235
思路
先遍历一遍,把col和char都记录好
然后再遍历一遍看看哪个字符应该放在最底层
然后再遍历一遍记录各个字符的row和总层数
最后放在数组中输出即可
代码
#include<iostream>
#include<cstring>
using namespace std;
const short N = 150;
char a[N][N];
struct data
{
char c;
int row;
int col;
};
int main()
{
string s;
while(cin >> s)
{
memset(a, ' ', sizeof(a));
int len = s.length();
int min;
int loc = 0;
int temp = min = 0;
data* D = new data[len];
for(int i = 0; i < len; i++)
{
D[i].c = s[i];
D[i].col = i;
}//①
for(int i = 0; i < len - 1; i++)
{
if(s[i + 1] < s[i])
temp--;
else if(s[i + 1] > s[i])
temp++;
if(temp < min)
{
min = temp;
loc = i + 1;
}
}//②
D[loc].row = 0;
for(int i = loc; i > 0; i--)
{
if(D[i - 1].c > D[i].c)
D[i - 1].row = D[i].row + 1;
else if(D[i - 1].c < D[i].c)
D[i - 1].row = D[i].row - 1;
else
D[i - 1].row = D[i].row;
}
for(int i = loc; i < len - 1; i++)
{
if(D[i + 1].c > D[i].c)
D[i + 1].row = D[i].row + 1;
else if(D[i + 1].c < D[i].c)
D[i + 1].row = D[i].row - 1;
else
D[i + 1].row = D[i].row;
}//③
for(int i = 0; i < len; i++)
a[D[i].col][D[i].row] = D[i].c;
int h = 0;
for(int i = 0; i < len; i++)
{
if(D[i].row > h)
h = D[i].row;
}
for(int i = h; i >= 0; i--)
{
for(int j = 0; j < len; j++)
{ cout << a[j][i];}
cout << endl;
}//④
}
return 0;
}