POJ-2588(snakes,抽象成图结构)

博客主要介绍了如何解决POJ-2588问题,通过将蛇及其攻击范围视为圆并抽象为点,建立点与点之间的边连接条件。将上边界和下边界也作为点处理,通过判断点与边界的相交情况。当存在从左到右的路径时,等价于不存在S到T的路径,利用深度优先搜索或广度优先搜索来判断。同时,通过分析找到最大纵坐标来确定左右边界坐标。整个过程可在SOJ上通过验证,但在POJ上无法通过。
摘要由CSDN通过智能技术生成

【转载思想】

题目意思就不说了,这里主要说一下做法!

我们把蛇连同它的攻击范围看做一个圆,再把圆抽象成一个点!点与点之间有边连接仅当两个点代表的圆有公共面积!然后我们在把上边界和下边界各抽象成一个点(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; &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值