OpenJudge_P7598 最匹配的矩阵

总时间限制: 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[N][N],b[N][N];
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);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值