【转载思想】
题目意思就不说了,这里主要说一下做法!
我们把蛇连同它的攻击范围看做一个圆,再把圆抽象成一个点!点与点之间有边连接仅当两个点代表的圆有公共面积!然后我们在把上边界和下边界各抽象成一个点(S和T),同样上边界与点之间有边连接仅当点代表的圆与上边界相交,同理,可得下边界与点之间的边关系!
这样处理以后如果有从左到右的路径,当且仅当不存在S到T通路!只要深搜或者广搜即可!但是题目还要我们求出左右的坐标,只需确定纵坐标即可,而且纵坐标要最大!所以我们考虑与S连通的每一个点,如果该点代表的圆与左边界有交点,那么如果从这个交点上面走一定走不过去,所以我们更新左边的纵坐标到这个交点处,对所有的圆都这样处理,即可确定左边纵坐标,右边的同理可求!而且这一步可以在求连通的时候随便求出,我们只需从S出发,一直搜即可!
ps:只能在SOJ上AC,不能再POJ上AC
struct point
{
int x, y;
int r;
double left;
double right;
} wo[1005];
int g[1005][1005];
int ans;
int n;
int flag[1005] = {0};
void dfs(int s)
{
if (flag[s] == 1) return ;
if (s == n + 1) {
ans = 1;
return ;
}
flag[s] = 1;
int i;
for (i = 0; i < n + 2; &