描述
给定一个mn的矩阵A和rs的矩阵B,其中0 < r ≤ m, 0 < s ≤ n,A、B所有元素值都是小于100的正整数。求A中一个大小为r*s的子矩阵C,使得B和C的对应元素差值的绝对值之和最小,这时称C为最匹配的矩阵。如果有多个子矩阵同时满足条件,选择子矩阵左上角元素行号小者,行号相同时,选择列号小者。
输入
第一行是m和n,以一个空格分开。
之后m行每行有n个整数,表示A矩阵中的各行,数与数之间以一个空格分开。
第m+2行为r和s,以一个空格分开。
之后r行每行有s个整数,表示B矩阵中的各行,数与数之间以一个空格分开。
(1 ≤ m ≤ 100,1 ≤ n ≤ 100)
输出
输出矩阵C,一共r行,每行s个整数,整数之间以一个空格分开。
样例输入
3 3
3 4 5
5 3 4
8 2 4
2 2
7 3
4 9
样例输出
4 5
3 4
#include <iostream>
#include <cmath>
#include <limits.h>
using namespace std;
#define MAX 101
int main()
{
int m,n,r,s,A[MAX][MAX],B[MAX][MAX],min=0,temp;
int i,j,l,k,rh=0,rl=0;
cin >> m >> n;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>A[i][j];
//min += A[i][j];
}
}
cin >> r >> s;
for(i=0;i<r;i++)
{
for(j=0;j<s;j++)
{
cin>>B[i][j];
}
}
min = INT_MAX;
for(i=0;i<=m-r;i++)
{
for(j=0;j<=n-s;j++)
{
temp = 0;
for(l=0;l<r;l++)
{
for(k=0;k<s;k++)
{
temp += abs(A[i+l][j+k]-B[l][k]);
}
}
if(temp<min)
{
min = temp;
rh = i;
rl = j;
}
}
}
for(i=0;i<r;i++)
{
for(j=0;j<s;j++)
{
cout<<A[rh+i][rl+j]<<' ';
}
cout<<endl;
}
return 0;
}