首页 > 代码库 > 1.12.4

1.12.4

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 
来源
医学部 2010 期末试题 林洪武
 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstring>
 4 using namespace std;
 5 int x1=10000000;
 6 int main()
 7 {
 8     int m,n,r,s;
 9     scanf("%d %d",&m,&n);
10     int a[m][n];
11     for(int i=0;i<m;i++)
12      for(int j=0;j<n;j++)
13       scanf("%d",&a[i][j]);
14     scanf("%d %d",&r,&s);
15     int b[r][s];
16     for(int i=0;i<r;i++)
17      for(int j=0;j<s;j++)
18       scanf("%d",&b[i][j]);
19     int c[r][s],d[r][s],x=0;
20     
21     for(int i=0;i<=m-r;i++)
22      {
23          for(int j=0;j<=n-s;j++)
24          {
25              x=0;
26           for(int k=0;k<r;k++)
27           {
28               for(int k1=0;k1<s;k1++)
29               {
30                   x+=abs(a[i+k][j+k1]-b[k][k1]);
31                   c[k][k1]=a[i+k][j+k1];
32               }
33           }    
34           if(x<x1)
35               {
36                   x1=x;
37                   memcpy(d,c,sizeof(c));
38                   
39               }
40          }
41          
42          
43      }
44      for(int i=0;i<r;i++)
45      {
46          for(int j=0;j<s;j++)
47           printf("%d ",d[i][j]);
48           printf("\n");
49      }
50      return 0;
51 }

 

1.12.4