解题思路:
1.由题可得,数组a是m行n列的,数组b是r行s列的,在数组a中找一个大小为r行s列的数据要求和b数组中对应位置的每个元素值相减的绝对值,然后累加求和,这个和最小的时候,输出数组
2.题目要求,如果出现了和相同的情况,优先输出较小行,或者较小列,那么,我们在判断的时候,从小到大遍历行列即可,并且只有sum<mine的时候,才更新最小值mine,这样可以规避这个要求
3.然后设定一个judge函数来求和,judge为无返回值有参数函数,两个参数为当前位置的行号和列号,然后从当前行号,列号开始遍历a数组,大小为r*s,依次去和数组b对应位置元素值相减,将绝对值累加,数组b的遍历可以利用xx和yy下标来访问
4.累加求和之后,判断是否小于最小值,如果满足,则mine更新,并且ans和res存储此时的行号和列号
5.最后输出以ans行res列开始的大小为r*s的数组
#include<bits/stdc++.h>
using namespace std;
int a[105][105],b[105][105];//定义a数组,b数组
int m,n,r,s,mine=99999999;//定义m行n列,r行s列,最小值初始化
int ans,res;//ans和res存放答案数组的起始坐标
void judge(int aa,int bb)//judge为无返回值有参函数
{
int xx=0,yy=0,sum=0;//xx和yy为数组b的下标,sum为累加器求和
for(int i=aa;i<=aa+r-1;i++)//遍历aa行bb列大小为r*s的数组
{
xx++;//b数组行数增加
for(int j=bb;j<=bb+s-1;j++)
{
yy++;//b数组列数增加
sum=sum+fabs(a[i][j]-b[xx][yy]);//将差的绝对值添加到累加器中
}
yy=0;//遍历完一列,列数归零
}
if(sum<mine)//判断如果累加器小于最小值
{
mine=sum;//最小值更新
ans=aa;//ans记录此时的行号
res=bb;//res记录此时的列号
}
return ;
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];//输入数组a
cin>>r>>s;
for(int i=1;i<=r;i++)
for(int j=1;j<=s;j++)
cin>>b[i][j];//输入数组b
for(int i=1;i<=m-r+1;i++)//开始遍历a数组,行的终止范围为m-r+1
{
for(int j=1;j<=n-s+1;j++)//列的终止范围为n-s+1
{
judge(i,j);//执行判断函数,将i和j参数传入
}
}
for(int i=ans;i<=ans+r-1;i++)
{
for(int j=res;j<=res+s-1;j++)//输出数组
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}