解题思路:

注意事项:

参考代码:

#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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论