P1598 垂直柱状图
菜鸟生成记(25)
这个题有点水,考察字符串的基本功(哎!就喜欢这考基本功的水题)
这一题涉及到输入带空格的字符串输入和格式化输出;
唉!只从gets死了(C11删除gets,洛谷好像对gets和getchar也很不友善)之后,就很烦,很难受;
没办法只能找替代品了;突然发现string还是很不错的,功能贼强(C++牛批)
下面是带空格的字符串输入的一些方法(这是参考大佬的);
大佬的帖子地址
#include<bits/stdc++.h>
using namespace std;
const int N=2e+2+10;
char s[N][N];//存原图(下面,图1)
int a[N]={0};//字符计数(字母的ASCII作为下标)
int main()
{
int max1=0;//记录出现最多的字母(以便后面补空格)
int k=0;//取值0~26(k+'A'代表26个字母)
for(int i=0;i<4;i++)
{
string str;
getline(cin,str);//读取带空格的字符串
for(int j=0;j<str.length();j++)
a[str[j]]++;//记录字母出现的次数
}
for(int i='A';i<='Z';i++)
if(a[i]>max1)
max1=a[i];//记录出现最多的字母的个数(以便后面补空格)
for(int i=0;i<51;i++)//A B C ... Z因为输出时要穿插着空格行
{//所以要循环2倍-1(尾部没有空格行);
if(i%2==0)//偶数行为字母行
{
int x='A'+k++;//A~Z;
s[i][0]=(char)x;//强制转化char
//每一行第一个元素储存A~Z一个字母
for(int j=1;j<=a[x];j++)//a[x]:字母x的个数
{
s[i][j]='*';
}
for(int j=a[x]+1;j<=max1;j++)
s[i][j]=' ';//不够最大长度补空格
}
else//奇数行为空格行
{
for(int j=0;j<=max1;j++)
s[i][j]=' ';
}
//cout<<s[i]<<endl;
}//现在只得到了原图(图1),经过下面的格式化输出就是图2了
for(int i=max1;i>=0;i--)
{//输出矩阵(下面,图2)
for(int j=0;j<51;j++)
cout<<s[j][i];
cout<<endl;
}
return 0;
}
/*图1
A*****
B*
C*
D**
E********
F**
G***
H*****
I****
J*
K*
L****
M****
N**
O**********
P***
Q*
R*******
S****
T*******
U***
V*
W*
X**
Y**
Z*
*/
/*图2
*
*
* *
* * * *
* * * *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
*/