私信TA

用户名:uq_60654334766

访问量:548

签 名:

等  级
排  名 647
经  验 4056
参赛次数 0
文章发表 6
年  龄 0
在职情况 在职
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

注意事项:

参考代码:

#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 人评分

  评论区

  • «
  • »