题目出自:厦门大学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