判断圆是否被若干圆包围的问题--厦大1046

该博客主要讨论厦门大学在线评测系统中的1046题,涉及判断圆是否被其他圆包围的问题。作者指出常规寻路算法不适用,需要使用计算几何的方法。首先检查英雄坐标是否在多边形内部,然后构建上三角矩阵和邻接表,通过寻找回路来判断圆是否被包围。文中提到了算法存在的问题和改进思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目出自:厦门大学OJ的1046

 

这题嘛,出的还是比较好的。

游戏中实现的寻路算法,可能是astar或者dj

但题目里这么问起来,那就不能用常规的寻路算法了。毕竟一个是方框,另一个园。方框可以看成坐标系的点,但是圆不行。所以还是要用计算几何。

 

开始的思路是:

1.先判断英雄坐标是否在点组成的多边形内;

2.再判断把点按逆时针的顺序连起来,按顺序计算每两个点之间的距离是否大于圆的直径和两个点的半径(limit)。

后来发现这个算法有很大的缺陷,无法计算凹多边形。

 

纠正的思路是:

1.先计算可以阻塞英雄的边(两个点距离小于limit),把这些点存到一个上三角矩阵里;

2.由上面的矩阵构成一个邻接表;

3.找出邻接表中各个点作为起点存在的回路;

4.判断英雄坐标是否在回路中。

 

代码可以再精简点。不过懒得弄了。。。呵呵

 

#include<stdio.h>
#include<stdlib.h>

#include <math.h>


int fp=0;
int hero[3];
int unit[20][4];
int matrix[100][100];
double culcos(int x,int y,int xo,int yo,int n,int m){
	double s;
	s=sqrt((x-n)*(x-n)+(y-m)*(y-m))*sqrt((xo-n)*(xo-n)+(yo-m)*(yo-m));
	return acos
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值