题目分析:
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;
}