2021-08-08 CFF-CSP 灰度直方图 C语言实现
前言
本次实验所用设备为微软Surface pro4
,操作系统为windows10
。
注意事项
(1)CFF-CSP考试提交一定要使用C++编译环境 。
实验题目
实现代码如下
1、暴力破解版。
#include<stdio.h>
int main()
{
//申请变量
double L,r,t,sum,result,count;
int n,count1;
//初始化数据
scanf("%d",&n);
scanf("%lf",&L);
scanf("%lf",&r);
scanf("%lf",&t);
double A[n][n];
count1 = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
scanf("%lf",&A[i][j]);
}
}
//对每一个数的邻域进行测试
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
sum = 0.0; //对总数进行整合的初始化
count = 0.0; //对计数器进行初始化
//对本身这一行以及左边的数据进行加
for(int k = 0;k <= r;k++)
{
//对左上方的数据进行加
for(int g = 0;g <= r;g++)
{
if(i-k >= 0 && j-g >= 0)
{
//printf("%d %d",i-k,j-g);
sum += A[i-k][j-g];
//printf("%0.lf ",A[i-k][j-g]);
count++;
}
}
//对左下方的数据进行加
for(int g = 1;g <= r;g++)
{
if(i-k >= 0 && j+g < n)
{
sum += A[i-k][j+g];
//printf("%0.lf ",A[i-k][j+g]);
count++;
}
}
}
//对除本身这一行以外的右边的数据进行加
for(int k = 1;k <= r;k++)
{
//对左上方的数据进行加
for(int g = 0;g <= r;g++)
{
if(i+k < n && j-g >= 0)
{
sum += A[i+k][j-g];
//printf("%0.lf ",A[i+k][j-g]);
count++;
}
}
//对左下方的数据进行加
for(int g = 1;g <= r;g++)
{
if(i+k < n && j+g < n)
{
sum += A[i+k][j+g];
//printf("%0.lf ",A[i+k][j+g]);
count++;
}
}
}
//printf("\n");
//printf("%.0lf %0.lf\n",sum ,count);
//对最后的数据进行整合处理
//sum = sum-A[i][j];
result = sum/count;
if(result <= t)
{
//printf("%.0lf%d%d ",A[i][j],i,j);
count1++;
}
}
}
//对最后结果进行输出
printf("%d",count1);
return 0;
}
2、算法捷径版。
#include<stdio.h>
int main()
{
//声明变量
int n, L, r, t;
int A[600][600];
int result = 0;
//变量初始化
scanf("%d",&n);
scanf("%d",&L);
scanf("%d",&r);
scanf("%d",&t);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
scanf("%d",&A[i][j]);
}
}
//声明变量并且初始化
int sum = 0, num = 0, lastsum = 0, lastnum = 0;
//对每一行的首个元素的邻域进行处理
for(int i = 0;i < n;i++)
{
sum = num = 0; //再次进行数据初始化
int bound_x = i + r > n - 1? n - 1 : i + r; //定义坐标x的边界(对每一行的第一个数据进行处理)
int bound_y = 0 + r > n - 1? n - 1 : 0 + r; //定义坐标y的边界 (对每一行的第一个数据进行处理)
int start_x = i - r > 0 ? i - r : 0; //定义坐标x的开始边界(对每一行的第一个数据进行处理)
//求第一个邻域的元素数量和均值
for(int k = start_x; k <= bound_x; k++)
for(int m = 0; m <= bound_y; m++)
{
num++;
sum += A[k][m];
}
double avg = (double)sum / num;
lastnum = num; lastsum = sum;
if(avg <= t)
result++;
//对这一行后面的每一列的元素进行处理
for(int j = 1; j < n; j++)
{
sum = lastsum; //上一个邻域的总和
if(j - r <= 0) //处于邻域内
{
num = lastnum + bound_x - start_x + 1;
for(int m = start_x; m <= bound_x; m++)
sum += A[m][j+r];
avg = (double)sum / num;
}
else if(j + r > n - 1)
{
num = lastnum - (bound_x - start_x + 1);
for(int m = start_x; m <= bound_x; m++)
sum -= A[m][j - r - 1];
avg = (double)sum / num;
}
else
{
num = lastnum;
for(int m = start_x; m <= bound_x; m++)
sum += A[m][j+r] - A[m][j - r - 1];
avg = (double)sum / num;
}
if(avg <= t)
result++;
lastnum = num; lastsum = sum;
}
}
//输出最后结果
printf("%d",result);
return 0;
}