nyoj 1276 機器裝置(DFS)
機器裝置
描述
Alpha 公司設計出一種節能的機器裝置。它的內部結構是由 N 個齒輪組成。整個機器裝置有 一個驅動齒輪,當啟動它時,它立即按 10,000 圈/小時轉速順時針轉動,然後它又帶動與它相切 的齒輪反方向,即逆時針轉動。齒輪之間互相作用,每個齒輪都可能驅動著多個齒輪,最終帶動 一個工作齒輪完成相應的任務。 在這套裝置中,記錄了每個齒輪的圓心座標和齒輪半徑。已知驅動齒輪位於(0,0),最終的 工作齒輪位於(Xt, Yt)。 Alpha 公司想知道傳動序列中所有齒輪的轉速。所謂傳動序列,即能量由驅動齒輪傳送,最 後到達工作齒輪的過程中用到的所有齒輪。能量傳送過程是,在一個半徑為 R,轉速為 S 圈/每小 時的齒輪的帶動下,與它相切的半徑為 R’的齒輪的轉速為-S*R/R’ 轉/小時。負號的意思是, 表 示按反方向轉動。
已知,機器裝置中除了驅動齒輪以外,所有齒輪都可能被另外某個齒輪帶動,並且不會出現 2 個不同的齒輪帶動同一個齒輪的情況。 你的任務是計算整個傳動序列中所有齒輪的能量之和。即所有齒輪轉速的絕對值之和。
輸入
第一行: T 表示以下有 T 組測試資料(1≤T ≤8)
對每組測試資料:
第 1 行: N Xt Yt (2≤N ≤1100)
接下來有 N 行, Xi Yi Ri 表示 N 個齒輪的座標和半徑 i=1,2,….,N
( -5000 ≤Xi ,Yi ≤ 5000 3 ≤ Ri ≤ 1000 )
座標以及半徑是整數
輸出
每組測試資料,輸出佔一行,即所有齒輪轉速的絕對值之和 在double範圍內,輸出整數部分
樣例輸入
1
4 32 54
0 30 20
0 0 10
32 54 20
-40 30 20
樣例輸出
20000
來源
河南省第九屆省賽
思路:很水的dfs,注意輸出的時候要強制轉換成int型,因為%.0lf是四捨五入。。。
程式碼:
#include<stdio.h>
#include<math.h>
#include<string.h>
#define maxn 1111
const double eps=0.0000001;
struct node
{
int x,y,r;
} q[maxn];
int ed_x,ed_y,n,vis[maxn],flag;
double ans;
bool judge(int x1,int y1,int r1,int x2,int y2,int r2)
{
if((sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))-r1-r2)<eps)
return 1;
return 0;
}
void dfs(int x,int y,int r,double v,double sum)
{
if(x==ed_x&&y==ed_y)
{
flag=1;
ans=sum;
return ;
}
if(flag)
return ;
for(int i=0; i<n; ++i)
{
if(!vis[i]&&judge(x,y,r,q[i].x,q[i].y,q[i].r))
{
vis[i]=1;
dfs(q[i].x,q[i].y,q[i].r,v*r*1.0/q[i].r,sum+v*r*1.0/q[i].r);
vis[i]=0;
}
if(flag)
return ;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
int r,st;
scanf("%d%d%d",&n,&ed_x,&ed_y);
for(int i=0; i<n; ++i)
{
scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].r);
if(0==q[i].x&&0==q[i].y)
r=q[i].r,st=i;
}
vis[st]=1,flag=0;
dfs(0,0,r,10000,10000);
printf("%d\n",(int)ans);
}
return 0;
}