1. 程式人生 > >【ACM】影象分類

【ACM】影象分類

題目連結:http://acm.nuc.edu.cn/OJ/contest/show/43/1003

【問題描述】

現在, 我們需要你來解決一項影象分類任務。

首先我們需要介紹下簡單影象的資料儲存形式,你可以粗略的認為影象在數字意義就是一個二維矩陣(我們這裡不考慮通道),矩陣的每個位置的值表示影象該位置的畫素點的值。

關於影象分類,我們希望把相似的兩個影象儘可能分到一個類裡。因此我們需要引入一個考察兩個影象是否相似的標準,我們需要一個度量函式來表示兩個影象的相似程度。

下面我們簡單的介紹一下我們所採用的度量方式。

 

 

即為我們常見的 Manhattan distance (曼哈頓距離)

一個n*n的影象可以看做一個n*n維的向量。

顯而易見,如果兩個影象是完全相同的,那麼兩個影象的每個對應的畫素點都相同,即二維矩陣是完全相同,曼哈頓距離為0。

現在,你需要計算p=2時兩個影象的dist_mk,即它們的歐幾里得距離。

【輸入描述】

第一行輸入n表示影象的尺寸(即圖片的高跟寬相等均為n)。

然後輸入兩個n*n的矩陣,分別表示兩張照片。(保證題目中出現的數字均為正整數,且不超過100)

【輸出描述】

輸出一個整數(答案向下取整),表示兩張圖片的歐幾里得距離。

【提示】

對一個小數x向下取整可以寫為

#include<math.h>

(int)floor(x)

 


#include <math.h>
#include <stdio.h>
double a[204][102];
int main ()
{
	int i,j,n,d1;
	double d;
	scanf("%d",&n);
	for(i=0;i<2*n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%lf",&a[i][j]);
		}
	} 
	for(i=n;i<2*n;i++)
	{
		for(j=0;j<n;j++)
		{
			d+=((a[i][j]-a[i-n][j])*(a[i][j]-a[i-n][j]));
		}
	} 
	d1=(int)floor(sqrt(d));
	printf("%d",d1);
	return 0;
}