CSP 202104-1 灰度直方图

题目分析:

1、有一个矩阵 A,大小为 n * m,里面的每一个元素存的是 [0,L) 的值
2、有一个数组 h,长度为 L,其特点是:
(1)它的第 i 位的值是矩阵 A 里出现 i 这个数的次数
(2)注意,“位” 是指从 0 开始到 L - 1
3、求数组 h,并输出

解题思路:

1、用一个二维数组 A 存放矩阵 A
2、用一个一维数组 h 记录
3、遍历这个二维数组,里面的值出现一次,h 的相应位置就加 1

代码实现:

#include <stdio.h>
int main()
{
	int n, m, L; 
	int i, j;
	//输入矩阵的长宽和灰度的范围 
	scanf("%d %d %d", &n, &m, &L);
	
	//定义一个数组用来存放这个矩阵
	int A[500][500] = {0};
	
	//定义一个数组来记录某个数出现的次数
	int h[256] = {0};
	
	//输入矩阵
	for(i=0; i<n; i++)//控制行 
	{
		for(j=0; j<m; j++)//控制列
		{
			scanf("%d",&A[i][j]);
			h[A[i][j]]++; //出现一次就加一次
		} 
	} 
	
	//输出 h 数组 
	for(i=0; i<L; i++)
	{
		printf("%d ", h[i]);
	} 
	
	return 0;
}

另解1:

  • 我们发现,只要能用一个数组记录下来矩阵A里面有那些值就行,和它里面的顺序是没有关系的,所以我们也可以不使用二维数组,使用一维数组也是可以的:
#include <stdio.h>
int main()
{
	int n, m, L; 
	int i;
	//输入矩阵的长宽和灰度的范围 
	scanf("%d %d %d", &n, &m, &L);
	
	//定义一个数组用来存放这个矩阵
	int A[250000] = {0};
	
	//定义一个数组来记录 
	int h[256] = {0};
	
	//输入矩阵
	for(i=0; i<n*m; i++)
	{
			scanf("%d",&A[i]);
			h[A[i]]++;
	} 
	
	//输出 h 数组 
	for(i=0; i<L; i++)//控制行 
	{
		printf("%d ", h[i]);
	} 
	
	return 0;
}

另解2:

  • 其实我们再进一步稍微观察一下就会发现,矩阵 A 里的值真的需要用数组记录下来吗?
  • 其实那些值我们每次都只用过一次,之后就再也不需要用到了
  • 所以不妨就用一个 int 型变量 A 来记录,然后马上读取使用,使用之后,下次在重新刷新 A 的值,这样至始至终只用到了这一个 int 型的内存空间
#include <stdio.h>
int main()
{
	int n, m, L; 
	int i, j;
	int k;
	//输入矩阵的长宽和灰度的范围 
	scanf("%d %d %d", &n, &m, &L);
	
	//定义一个数组用来存放这个矩阵
	int A;
	
	//定义一个数组来记录 
	int h[256] = {0};
	
	//输入矩阵
	for(i=0; i<n*m; i++)
	{
			scanf("%d",&A);
			h[A]++;
	} 
	
	//输出 h 数组 
	for(i=0; i<L; i++)//控制行 
	{
		printf("%d ", h[i]);
	} 
	
	return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘学.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值