1. 程式人生 > >Hash 三角形特徵 (資料結構作業)

Hash 三角形特徵 (資料結構作業)

演算法與資料結構實驗題 9.1

★實驗任務

給定 n 個三角形,用 a,b,c 表示三角形的三條邊(三角形可能有重複)。之後有 m 次詢問,每次詢問一個三角形在給定的 n 個三角形中出現的次數。

★資料輸入

第一行為 n,之後 n 行,每行有 a,b,c 三個數字表示三角形的三條邊;接下來一行為 m,之後有 m 行詢問,每行有 a,b,c 三個數字,表示要詢問的三角形的三邊。

資料保證 a,b,c 為正整數且可以構成一個三角形,且 a,b,c 不一定有序對於 40%的資料,n<=100,m<=100,a,b,c<=100

對於 70%的資料,n<=1000,m<=1000,a,b,c<=1000

對於 100%的資料,n<=5,000,m<=100,000,a,b,c<=999999

★資料輸出

對於每次詢問,輸出此三角形在之前給定的 n 個三角形中出現的次數

輸入示例

輸出示例

3

2 2 3

3 3 4

2 3 2

3

2 3 2

3 3 4

1 1 1

2

1

0

 

★提示

整數 Hash、字串 Hash

 

這道題有多種解法.

1.三角形三邊長作為hash物件,hash=a*1e6+b*1e6+c;

2. 直接pair<a,pair<b,c>> 利用pair巢狀,放入map進行hash.

3.對題目特殊處理化,三邊整數a,b,c.周長a+b+c;面積 :海倫公式;pair<int ,double> ,放入map ,hash。

 

 

3.

/*
	Date: 17/11/18 00:24
	Description: 
		80 ms/5172 kb 
*/
#include <cstdio>
#include <map>
#include <cmath> 
using namespace std;
map <pair<int,double>,int > mp;
int main()
{
	double a,b,c,s;
	int n,m,sum;
	scanf ("%d",&n);	
	pair <int,double> p;
	while (n--)
	{
		scanf ("%lf %lf %lf",&a,&b,&c);
		sum=a+b+c;
		s=sqrt(sum/2.0*1.0*(sum/2.0-a)*(sum/2.0-b)*(sum/2.0-c));
		p.first=sum;
		p.second=s;
		mp[p]++;
	}
	scanf ("%d",&m);
	while (m--)
	{
		scanf ("%lf %lf %lf",&a,&b,&c);
		sum=a+b+c;
		s=sqrt(sum/2.0*1.0*(sum/2.0-a)*(sum/2.0-b)*(sum/2.0-c));
		p.first=sum;p.second=s;
		printf ("%d\n",mp[p]);
	}
	return 0;
}