1. 程式人生 > >nyoj 1276 機器裝置(DFS)

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; }