几何【P2313】 [HNOI2005]汤姆的游戏

z

你没有发现两个字里的blog都不一样嘛 qwq

题目描述--->p2313 [HNOI]汤姆的游戏

分析

说不上是分析.

数据范围给出来,这题明显暴力啊emmm。

个人认为的坑点.

这题不要判精度,判精度会挂掉.

输入点之后,直接暴力枚举图形去判断其是否在这个图形中。

本来以为长方形给的都是 左上角和右下角.

结果这题给的是右上角和左下角.

搞得我取了半天(max,min).

(代码自己看着都有点恶心.

(还是我没有看清题的说 emmm.

注意计算点到圆心的距离的公式

(sqrt{(x_i-x_j) imes (x_i-x_j) +(y_i-y_j) imes (y_i-y_j))})

------------------代码-------------------

#include<cstdio>
#include<iostream>
#include<cmath>
#define R register 
using namespace std;
int n,m;
struct cod
{
	char shape;
	double a,b,c,d,r;
}s[508];
int main()
{
	scanf("%d%d",&n,&m);
	for(R int i=1;i<=n;i++)
	{
		cin>>s[i].shape;
		switch(s[i].shape)
		{
			case 'r':
				{
					scanf("%lf%lf%lf%lf",&s[i].a,&s[i].b,&s[i].c,&s[i].d);
					break;
				}
			case 'c':
				{
					scanf("%lf%lf%lf",&s[i].a,&s[i].b,&s[i].r);
					break;
				}
		}
	}
	for(R int i=1;i<=m;i++)
	{
		R double x,y;R int cnt=0;
		scanf("%lf%lf",&x,&y);
		for(R int j=1;j<=n;j++)
		{
			if(s[j].shape=='c')
			{
				double dis=sqrt((s[j].a-x)*(s[j].a-x)+(s[j].b-y)*(s[j].b-y));
				if(dis<s[j].r)
					cnt++;
			}
			else
			{
				if(x==s[j].a or x==s[j].c)continue;	
				if(y==s[j].b or y==s[j].d)continue;
				if(x>min(s[j].a,s[j].c) and x<max(s[j].c,s[j].a)and y<max(s[j].b,s[j].d) and y>min(s[j].d,s[j].b))
				cnt++;
			}
		}
		printf("%d
",cnt);
	}
	
}
原文地址:https://www.cnblogs.com/-guz/p/9723593.html