04:最匹配的矩陣

總時間限制: 

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;
	
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章