利用vector来建立二维数组

题目描述

在某应用中, m × n 个像素灰度图像由 m × n 个正整数组成的矩阵表示,矩阵中每个整数元素表示一个像素。我们将两幅相同大小图像的差异度定义为各相同位置像素差的绝对值之和,将图像中某位置开始的m1 × n1矩形区域图像称为图像的子图像。给定m × n 个像素图像A和m1 × n1 个像素图像B,m〉=m1 且n 〉=n1, 现需要在图像A中查找与图像B具有最佳匹配(差异度最小)的大小为m1 × n1的子图像。 设计程序,分别读入图像A和图像B数据,输出主图像A的子图像与图像B的最小差异度和相应子图像在主图象中位置(左上角行列号)。如果满足要求的子图像有多个,请分别输出各子图像的位置

样例输入

6 15
213 66 28 226 131 243 24 250 77 159 62 77 72 17 250
36 234 254 255 241 39 149 142 136 218 87 245 139 103 41
86 38 158 167 169 253 227 188 4 99 140 111 26 205 139
0 3 134 77 52 59 164 226 237 236 58 93 253 112 207
126 60 17 15 142 217 20 193 139 237 247 249 133 86 246
143 72 194 212 207 59 10 215 114 136 194 21 206 125 14

3 4
78 53 59 165
16 119 209 20
225 217 50 11
样例输出

68
<4,4>

代码实现

#include<stdio.h>
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int main()
{
	vector<vector<int>> jojo;
	vector<int> wwh;
	vector<vector<int>> dio;//二维数组
	int sum=0;
	int min=6666666;
	vector<int> mini;
	vector<int> minj;
	int M, N;
	cin>>M>>N;
	for(int j=0;j<M;j++)
	{
		wwh.clear();
		for(int i=0;i<N;i++)
		{
			//wwh.clear();
			int data;
			cin>>data;
			wwh.push_back(data);
		}
		jojo.push_back(wwh);
	}
	int M1, N1;
	cin>>M1>>N1;
	for(int j=0;j<M1;j++)
	{
		wwh.clear();
		for(int i=0;i<N1;i++)
		{
			//wwh.clear();
			int data;
			cin>>data;
			wwh.push_back(data);
		}
		dio.push_back(wwh);
	}
	for(int i=0;i<=M-M1;i++)
	{
		for(int j=0;j<=N-N1;j++)
		{
			sum=0;
			for(int k=0;k<M1;k++)
			{
				for(int k1=0;k1<N1;k1++)
				{
					sum+=abs(jojo[i+k][j+k1]-dio[k][k1]);
				}
			}
			if(min==sum)
			{
				mini.push_back(i+1);
				minj.push_back(j+1);
			}
			else if(min>sum)
			{
				min=sum;
				mini.clear();
				minj.clear();
				mini.push_back(i+1);
				minj.push_back(j+1);
			}
		}
	}
	cout<<min<<endl;
	for(int i=0, j=0;i<mini.size()&&j<minj.size();i++, j++)
	{
		cout<<"<"<<mini[i]<<","<<minj[j]<<">";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值