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)
{
sum += 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];
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];
count++;
}
}
for(int g = 1;g <= r;g++)
{
if(i+k < n && j+g < n)
{
sum += A[i+k][j+g];
count++;
}
}
}
result = sum/count;
if(result <= t)
{
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;
int bound_y = 0 + r > n - 1? n - 1 : 0 + r;
int start_x = i - r > 0 ? i - r : 0;
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;
}
|