bzoj 1615 Usaco The Loathesome Hay Baler

齿轮相交判断与BFS算法
本文介绍了一种利用BFS算法判断齿轮是否相交的方法,并提供了完整的C++实现代码。通过寻找起始点和终止点之间的路径,计算最终答案。

冥思苦想应该怎么判断两个齿轮是否相交,看了下hzwer大佬的题解后发现自己还真是菜。

BFS就可以了,起始点和终止点都好找。

 

#include <cstdio>
#include <algorithm>
#include <queue>
 
struct node{
    int x,y,r;
}point[1222];
 
int dis(int a,int b){
    return (point[a].x-point[b].x)*(point[a].x-point[b].x)+(point[a].y-point[b].y)*(point[a].y-point[b].y);
}
 
bool Can(int a,int b){
    if( (point[a].r+point[b].r)*(point[a].r+point[b].r) == dis(a,b) ) return true;
    return false;
}
 
int n;
int ex,ey;
int Start,End,fa[1111];
double ans,v[1111];
bool vis[1111];
 
 
void bfs(){
    std::queue<int>Q;
    v[Start]=10000;
    vis[Start]=1;
    Q.push(Start);
    while( !Q.empty() ){
        int now = Q.front();
        Q.pop();
        for(int i=1;i<=n;i++){
            if(Can(now,i) && !vis[i]){
                vis[i]=1;
                fa[i]=now;
                Q.push(i);
                v[i]=v[now]*point[now].r/point[i].r;
                if(i==End) return;
            }
        }
    }
}
 
int main(){
    scanf("%d%d%d",&n,&ex,&ey);
    for(int i=1;i<=n;++i){
        scanf("%d%d%d",&point[i].x,&point[i].y,&point[i].r);
    }   
    for(int i=1;i<=n;i++){
        if(!point[i].x && !point[i].y) Start = i;
        if(point[i].x==ex && point[i].y==ey) End = i;
    }
    bfs();
    for(int i=End;i;i=fa[i]) ans+=v[i];
    printf("%d\n",(int)ans);
}

 

转载于:https://www.cnblogs.com/OIerLYF/p/7500459.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值