冥思苦想应该怎么判断两个齿轮是否相交,看了下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); }