洛谷P1598 垂直柱状图

这个题目比较坑爹啊,就是输出有着很严格的限制,不能有多余的空格,不能有多余的空行。

本来我是想直接输出的,发现不能一竖列一竖列地输出。好吧,想起用二维数组,又发现要从下往上输出星号。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;
    }


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值