2017-04-17 37 views
1

這是來自Kattis的編程挑戰之一,我已經解決了它,所以我想看看別人如何解決它。所以,我碰到這一塊的代碼,但我無法理解這兩個具體線路:for循環之後的if語句是什麼意思?

for(i=0;i<N;i++) if(inTree[i]) 

for(j=0;i<N;j++) if(inTree[j]) 

我不明白如何將這些if語句在此算法的工作。是否應該檢查兩個節點之間是否存在鏈接?代碼如下:

#include <stdio.h> 
#include <math.h> 
#define MAX 105 
int N,T; 
float x[MAX], y[MAX]; 

int inTree[MAX]; 
int main() 
{ 
    int c,i,j; 
    float dx,dy; 
    int minp; 
    float len,min,weigth; 
    scanf("%d",&T); 
    while(T--) 
    { 
    scanf("%d",&N); 
    for(i=0;i<N;i++) 
     inTree[i]=0; 
    for(i=0;i<N;i++) 
    { 
     scanf("%f %f",&x[i],&y[i]); 
     /*printf("%d (%f, %f)\n",i+1,x[i],y[i]);*/ 
    } 
    /* Prim's Algorithm */ 
    c=1; 
    inTree[0]=1; 
    weigth=0; 
    while(c<N) 
    { 
     min = -1.0; 
     for(i=0;i<N;i++) if(inTree[i]) 
     for(j=0;j<N;j++) if(!inTree[j]) 
     { 
      dx=x[i]-x[j]; dy=y[i]-y[j]; 
      len=sqrt(dx*dx+dy*dy); 
      if(min == -1.0 || len < min) 
      { 
      min=len; 
      minp=j; 
      } 
     } 
     inTree[minp]=1; 
     weigth+=min; 
     c++; 
    } 
    printf("%.2f\n",weigth); 
    if(T>0) 
     printf("\n"); 
    } 
    return 0; 
} 
+1

在循環的每次迭代中執行'if'。比較[this](http://coliru.stacked-crooked.com/a/3acf302359f1215a)。 –

+2

請注意,這種混淆是很多原因之一,爲什麼通常不鼓勵在控制結構中省略大括號,而在同一行上組合多個控制結構。這些事情往往會影響可讀性,如果代碼和結果增加了bug的機會。 – Christopher

回答

3

for loop語句對於body有單個語句。最常見的這種說法是在大括號塊,即

for (...) { 
    // multiple statements 
} 

然而,任何語句可以用來代替,包括if

for (...) 
    if (...) { 
     multiple statements 
    } 

注意,沒有花括號周圍if,因爲沒有其他語句由for循環控制。

因爲空白並不顯著,前兩行以上可以合併:

for (...) if (...) { 
    multiple statements 
} 

這是你在你的程序有結構。

+0

那麼花括號是用'if'而不是'for-loop'呢? –

+0

@Acuriousone正確。 – dasblinkenlight