解题思路:
注意事项:
参考代码:
#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 人评分
简单的a+b (C语言代码)浏览:641 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:512 |
【金明的预算方案】 (C++代码)浏览:873 |
【魔板】 (C++代码)(时间超限,希望会的帮我改正一下)浏览:804 |
printf基础练习2 (C语言代码)浏览:547 |
剪刀石头布 (C++代码)浏览:1811 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:653 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:620 |
回文数(一) (C语言代码)浏览:1170 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:690 |