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;
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值