洛谷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;
}
本来我是想直接输出的,发现不能一竖列一竖列地输出。好吧,想起用二维数组,又发现要从下往上输出星号。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;
}
相关文章推荐
- P1478
- P1035
- P1008 难度2.7
- 【题解】洛谷1164小A点菜
- 好吧,没事抒抒情
- 洛谷P1028 数的计算
- 洛谷P1914 小书童——密码
- 洛谷P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
- 洛谷P1553 数字反转(升级版)
- 洛谷P1035 级数求和
- 10.1做题——洛谷P1433 吃奶酪
- 10.9做题——洛谷P1927防护伞
- 10.10做题——USACO1.2/洛谷1207双重回文数(Dual Palindromes)
- 洛谷P1196银河英雄传说
- 洛谷P1115最大子段和
- 洛谷1086/NOI题库1.13.38/NOIP2004普及组第2题 花生采摘
- 洛谷P1024/NOI题库7891(2.3)/NOIP2001提高组T1 一元三次方程求解
- NOIP2002提高组/洛谷P1031均分纸牌
- 洛谷1791/CODEVS1214线段覆盖
- 洛谷P1541/CODEVS1068 乌龟棋