總時間限制:
1000ms
內存限制:
65536kB
描述
給定一個m*n的矩陣A和r*s的矩陣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<bits/stdc++.h>
using namespace std;
int a[110][110],c[110][110];
int m,n,r,s;
int f(int a1,int b1) //統計每個位置爲終點的絕對值的和
{ int sum=0;
for(int i=a1,x1=r;i>a1-r;i--,x1--)
{
for(int j=b1,y1=s;j>b1-s;j--,y1--)
{
sum=sum+abs(a[i][j]-c[x1][y1]);
// cout<<i<<' '<<j<<' '<<i-r<<' '<<j-s<<endl;
}
}
return sum;
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
cin>>r>>s;
int he=0;
for(int i=1;i<=r;i++)
for(int j=1;j<=s;j++)
cin>>c[i][j];
int maxv=INT_MAX;
int x,y;
for(int i=r;i<=m;i++)
{
for(int j=s;j<=n;j++)
{
int s1=f(i,j);
// cout<<s1<<' '<<i<<' '<<j<<endl;
if(abs(s1)<maxv)
{
maxv=abs(s1);
x=i,y=j;
}
}
}
for(int i=x-r+1;i<=x;i++)
{
for(int j=y-s+1;j<=y;j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
return 0;
}