欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算几何学习

程序员文章站 2022-03-02 10:48:48
...

一、计算几何基础
1.圆
P1652

给出 n个圆,保证任意两个圆都不相交。 然后给出两个点(x1,y1),(x2,y2),保证均不在某个圆上,要从 (x1,y1) 到
(x2,y2)画条曲线,问这条曲线最少穿过多少次圆的边界?

输入格式

第一行为一个整数 n,表示圆的个数;
第二行是 n 个整数,表示 n个圆的 x 坐标;
第三行是 n 个整数,表示 n个圆的 y 坐标;
第四行是 n 个整数,表示 n 个圆的半径 r;
第五行是四个整数x1,y1,x2,y2;

输出格式

仅一个整数,表示最少要穿过多少次圆的边界。

输入

7
1 -3 2 5 -4 12 12
1 -1 2 5 5 1 1
8 1 2 1 1 1 2
-5 1 12 1

输出

3

对于 100% 的数据,1≤n≤50,∣x∣,∣y∣≤1000,1≤r≤1000。保证圆之间没有公共点。

因为是曲线是任意画的,所以只要一个点在圆内,一个点在圆外,不管怎么画,总要从穿过这个圆的边界。
判断一个在圆内,另一个在圆外时,可以用异或,看两点到圆心的距离是否小于(不能等于)半径。

#include<bits/stdc++.h>
using namespace std;
double dis(int x1,int y1,int x2,int y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
	int n,x[55],y[55],r[55],ans=0,x1,x2,y1,y2;
	scanf("%d",&n);
	for(int i = 0; i < n; i++)
		scanf("%d",&x[i]);
	for(int i = 0; i < n; i++)
		scanf("%d",&y[i]);
	for(int i = 0; i < n; i++)
		scanf("%d",&r[i]);
	scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
	for(int i = 0; i < n; i++)
	{
		if((dis(x[i],y[i],x1,y1) < r[i] ) ^ dis(x[i],y[i],x2,y2)<r[i]) ans++;
	}
	printf("%d\n",ans);
	return 0;
}

相关标签: 21暑假