解题思路:
注意事项:
参考代码:
#include <stdio.h>
int main()
{
int m1,m2,n1,n2,isok=1;
scanf("%d %d",&m1,&m2);
int a[m1][m2];
for(int i=0;i<m1;i++)
for(int j=0;j<m2;j++)
scanf("%d",&a[i][j]); //第一个多维数组
scanf("%d %d",&n1,&n2);
int b[n1][n2];
for(int i=0;i<n1;i++)
for(int j=0;j<n2;j++)
scanf("%d",&b[i][j]); //第二个多维数组
//以上代码是输入两个多维数组
int row=0,column=0,minrow=0,mincolumn=0;
long int min=100*(n1*n2); //所有元素值都是小于100的正整数,因此每两个元素差值绝对值不会大于100,而一共有n1*n2个元素。
long int sum=0;
while(isok) //大循环:进行所有的匹配。
{
sum=0;
for(int i=0;i<n1;i++)
{
for(int j=0;j<n2;j++)
{
sum += abs(a[i+row][j+column]-b[i][j]); //差值绝对值之和,此时进行匹配的矩阵首坐标为(row,column).
}
}
if(sum<min) //这个程序是从左到右,从上到下,所以不需要进行其他判断。
{
min = sum;
minrow=row;
mincolumn=column; //记录最佳匹配的相关信息。
}
column++;
if(column+n2>m2) column=0,row++; //判断是否到达最右端,是的话,就“回车”。
if(row+n1>m1) isok=0; //判断是否找到了所有的匹配。如果是,跳出while循环。
}
//输出最佳匹配,每输出n2个数就换一行。
int cnt=0;
for(int i=minrow;i<n1+minrow;i++)
for(int j=mincolumn;j<n2+mincolumn;j++)
{
printf("%d ",a[i][j]);
cnt++;
if(!(cnt%n2)) printf("\n");
}
return 0;
}
以下为代码链接:https://www.dotcpp.com/run/13346254
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复