Openjudge 1.12-04

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 
把每种情况记录下来排一遍序就好了 没什么技巧。233
附代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>

using namespace std;

struct node{
    int han,lie,he;
}e[10001];
bool cmp(node x,node y)
{
    if(x.he!=y.he) return x.he<y.he;
    else if(x.han!=y.han&&x.lie!=y.lie) return x.han<y.han;
    else return x.lie<y.lie;
}
int tot,l,minn=0x7fffffff,m,n,i,j,za[101][101],zb[101][101],r,s;
int pd(int w,int er)
{
    int h=0,q,t,ha=1,li=1;
    for(q=w;q<w+r;++q)
    {
        li=1;
        for(t=er;t<er+s;++t)
        {
            h+=abs(za[q][t]-zb[ha][li++]);
        }
        ha++;
    }
    return h;
}
void wk()
{
    for(i=1;i<=m-r+1;++i)//枚举行的每个情况
    {
        for(j=1;j<=n-s+1;++j)//枚举列的每个情况
        {
            int b=pd(i,j);
            if(b)
            {
                e[tot++].han=i;
                e[tot-1].lie=j;
                e[tot-1].he=b;
            }
        }
    }
}
int main()
{
    cin>>m>>n;
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;++j)
        cin>>za[i][j];
    }
    cin>>r>>s;
    for(i=1;i<=r;++i)
    {
        for(j=1;j<=s;++j)
        cin>>zb[i][j];
    }
    wk();
    sort(e,e+tot,cmp);
    for(i=e[0].han;i<e[0].han+r;++i)
    {
        for(j=e[0].lie;j<e[0].lie+s;++j)
        cout<<za[i][j]<<" ";
        cout<<endl;
    }
}
View Code
 
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
原文地址:https://www.cnblogs.com/ruojisun/p/6142563.html