您的位置:首页 > 其它

洛谷P1598 垂直柱状图

2016-07-08 16:42 232 查看
这个题目比较坑爹啊,就是输出有着很严格的限制,不能有多余的空格,不能有多余的空行。
本来我是想直接输出的,发现不能一竖列一竖列地输出。好吧,想起用二维数组,又发现要从下往上输出星号。j--倒过来就行了。

后来又发现输出的时候有多余的空行,又写了一段删了它。虽然是入门难度,但还是得周全考虑的。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char chuan[10010],ewsz[26][100]={' '};
int prnt[10010]={0},hght=0,hs=0;
//prnt:每个字母出现的个数计数;hght:最大高度;hs:开始输出的行数
int main(){

for(int k=1;k<=4;k++){//输入4个串,k最大改动也可以输入5678个串
gets(chuan);//不能用cin,否则单个输入
for(int i=0;i<strlen(chuan);i++){//循环到结束
prnt[chuan[i]]++;//prnt数组中的那个大写字母计数加1
if(prnt[chuan[i]]>hght){
hght=prnt[chuan[i]];
}//如果该字母计数超过了最大高度,更新。
}
for(int i='A';i<='Z';i++){//开始在二维数组打框架
for(int j=hght-1;j>=0;j--){//从下往上累加
if(hght-j<=prnt[i]){//hght-j就是从下数的高度
ewsz[i][j]='*';
}//如果高度在该字母计数之内,就输出*
else{
ewsz[i][j]=' ';
}//超出了高度,当然只能打空格咯
}
}
}

for(int j=0;j<hght;j++){//从第一行开始枚举
int js=0;//这里是空格计数。每到另一行就清零。
for(int i='A';i<='Z';i++){
if(ewsz[i][j]==' '){//如果有空格,
js++;//计数加1
}
}
if(js==26){//如果这一行全是空格,
hs++;//丢掉它。
}
}//这个是用来消除多余空行的。不知道什么原因会多空行,就删了他吧。

for(int j=hs;j<hght;j++){//这里从无空格的行数hs开始输出
for(int i='A';i<='Y';i++){
cout<<ewsz[i][j]<<" ";
}//对于输出有严格的限制。所以空格输出只能到Y。
cout<<ewsz['Z'][j]<<endl;//Z后没有空格。反正要回车的,一起弄了吧。
}
cout<<"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";
//输出下面的字母说明!
return 0;
}

-------------------------------------后来老爸又提出来不用二维数组,单行刷------------------------------------

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char chuan[1001];
int js[26],max_number=0;

int main(){

for(int k=1;k<=4;k++){ //读入4个串并计数
gets(chuan);
for(int i=0;i<strlen(chuan);i++){
int index = chuan[i]-'A'; //计算下标
js[index] ++ ; //累计
if (js[index] > max_number ) max_number = js[index]; //计算最高柱子
}
}

while( max_number>0 ){
for(int k=0;k<26;k++){
if ( js[k] == max_number ){
cout<<"* "; js[k]--;
}
else cout<<" ";
}
cout<<endl; //换行以便输出下一行信息
max_number--; //最高柱子高度降一行
}

cout<<"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";

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  洛谷