题目:
给你一些齿轮的位置,半径,第一个齿轮是动力轮,问最后一个是否能被带动
将会出现三种情况 1.能被带动 2.动力轮被卡住了 3.最后一个轮没有连接
思路: 比赛时我把它想成一个图论问题,没想到还是翻车了,出现卡住的原因是三个齿轮成环,但我判断成只要成环就被卡住,所以WA到怀疑人生,后来看到大佬们的代码,深深感到自己的智障
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node1
{
int x,y,r;
}a[1005];
int n;
int flag;
int mp[1005][1005],dir[1005];
void dfs(int u)
{
for(int i=1;i<=n;i++)
{
if(mp[u][i]){
if(dir[u]+dir[i]!=3&&dir[i]!=0)
{
flag=1;
return ;
}
if(dir[i])
continue;
dir[i]=3-dir[u];
dfs(i);
if(flag)
return ;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y>>a[i].r;
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(i!=j)
if((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y)==(a[i].r+a[j].r)*(a[i].r+a[j].r))
{
mp[i][j]=1;
mp[j][i]=1;
}
}
}
dir[1]=1;
dfs(1);
if(!flag)
{
if(dir[n]==0)
{
cout<<"The input gear is not connected to the output gear."<<endl;
return 0;
}
else
{
int p=__gcd(a[1].r,a[n].r);
if(dir[1]!=dir[n]){
cout<<-a[1].r/p<<':'<<a[n].r/p<<endl;
}
else
{
cout<<a[1].r/p<<':'<<a[n].r/p<<endl;
}
return 0;
}
}
else
{
cout<<"The input gear cannot move.";
return 0;
}
return 0;
}