您的位置:首页 > 运维架构

OpenJudge_P7598 最匹配的矩阵

2015-11-24 19:02 274 查看
总时间限制: 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<cstdio>
#include<climits>
#include<iostream>
using namespace std;
#define N 105
int m,n,r,s;
int a

,b

;
int minv,ansi,ansj;
inline int abs(int x){
return x<0?x*(-1):x;
}
inline int calc(int x,int y){
int v=0;
for(int i=x;i<x+r;i++)
for(int j=y;j<y+s;j++)
v+=abs(a[i][j]-b[i-x][j-y]);
return v;
}
inline void print(int x,int y){
for(int i=x;i<x+r;i++){
for(int j=y;j<y+s;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
scanf("%d%d",&r,&s);
for(int i=0;i<r;i++)
for(int j=0;j<s;j++)
scanf("%d",&b[i][j]);
minv=INT_MAX;
for(int i=1;i<=m-r+1;i++)
for(int j=1;j<=n-s+1;j++)
if(minv>calc(i,j)) ansi=i,ansj=j,minv=calc(i,j);
print(ansi,ansj);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: