zoukankan      html  css  js  c++  java
  • 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
     
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    ABP AsyncHelper.RunSync 内部实现
    ABP 扩展 OrganizationUnit 数据实体(新增字段)
    ABP 调用 PUT 接口报错 405 Method Not Allowed
    ABP 扩展 Role 数据实体(新增字段)
    C# EntityFramework 自定义数据库表名(一)
    EPPlus.Core(OfficeOpenXml) 获取 Excel 数据集合
    C# 获取文件并将文件按创建/修改时间排序
    C# 计算两个日期之间的月份数(差值)
    C# Split 方法扩展支持双引号
    教你在 C# 代码中写出带高亮关键字的注释
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6142563.html
Copyright © 2011-2022 走看看