绝对值最小子矩阵

题目描述

给定一个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矩阵中的各行,数与数之间以一个空格分开。

输出

输出矩阵C,一共r行,每行s个整数,整数之间以一个空格分开。
 

样例输入

3 3
3 4 5
5 3 4
8 2 4
2 2
7 3
4 9

样例输出

4 5
3 4
 

数据范围限制

1<=m<=100,1<=n<=100
#include <iostream>
#include<cmath>
using namespace std;
int a[101][101];
int b[101][101];
int row,col; 
int m,n,r,s;
int min_=12345632;  //全局的,不能放在f里面 
 
int f(int hang,int lie)
{
	int sum=0;
	
	for(int i=1;i<=r;i++)
	{
	  for(int j=1;j<=s;j++)
	  {
	    sum+=abs(a[i+hang-1][j+lie-1]-b[i][j]); 
	  }
	}
	if(sum<min_)
	{
	  row=hang;
	  col=lie;
	  min_=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;
	for(int i=1;i<=r;i++)
	  for(int j=1;j<=s;j++)
	    cin>>b[i][j];
	    
	for(int i=1;i<=m-r+1;i++)   //处理函数 
	  for(int j=1;j<=n-s+1;j++)
	       f(i,j);
	    
	    
	for(int i=0;i<r;i++)
	{
	  for(int j=0;j<s;j++)
	    cout<<a[i+row][j+col]<<" ";
	    cout<<endl;
	}
	return 0;
} 

  

猜你喜欢

转载自www.cnblogs.com/fangzheng-nie/p/9954959.html