解题思路:主要是在大矩形当中找小矩形,最关键的一个地方就是找到小矩形左上角的元素,然后进行for循环展开就可以了,但是这边要注意的是在进行寻找左上角元素的时候,他的最终位置一定要注意.
注意事项:min我这边是使用了一个define,玩家可以自行定义,int的最大值即可.
参考代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX_INT ~((unsigned int)0)>>1;//输出int型可以表示的最大值
int main()
{
/*
输入函数,注意是二维数组,也就是行列
*/
int m,n,i,j,r,s;
int a[101][101],b[101][101];
scanf("%d %d\n",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d ",&a[i][j]);
}
scanf("\n");
}
scanf("%d %d\n",&r,&s);
for(i=0;i<r;i++)
{
for(j=0;j<s;j++)
{
scanf("%d ",&b[i][j]);
}
scanf("\n");
}
int drow,dcol,min;
min =MAX_INT;
for(i=0;i<m-r+1;i++)//注意行列和矩形
{
for(j=0;j<n-s+1;j++)//上面两个for选定了一个值(左上角元素),然后从该值出发进行选择矩形
{
int k,l,sum=0;
for(k=0;k<r;k++)//执行要选择出来的矩形
{
for(l=0;l<s;l++)
sum=sum+abs(abs(a[i+k][j+l]-b[k][l]));
}
if(sum<min)//要取最小的,行列
{
drow=i;dcol=j;min=sum;//drow和dcol是在大矩形当中的起始值
}
}
}
for (i = 0; i < r; i++) {
for (j = 0; j < s; j++)
printf("%d ", a[drow + i][dcol + j]);
printf("\n");
}
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复