2016-05-13 53 views
0

我試圖開發一個代碼來解決C中的旅行推銷員問題,但我有一些限制:我只能使用「for」,而「,」做「,數組,矩陣簡單之類的東西,所以,無功能或遞歸(不幸)生成所有可能的排列在C

到目前爲止,我已經得到了什麼:

用戶將將輸入城市座標x和y是這樣的:

8.15 1.58 
9.06 9.71 
1.27 9.57 
9.13 4.85 

存儲座標的代碼。

float city[4][2]; 
int i; 

for (i=0; i<4; i++) 
    scanf("%f %f", &cidade[i][0], &cidade[i][1]); 

有4個城市,所以「i」從0到3.X和Y存儲在矩陣[0]和[1]的第二維上。

現在的問題是我必須生成矩陣的第一維的所有可能的排列。這似乎很容易與4個城市,因爲所有可能的路線(它必須始於城市A每次):

A B C D 
A B D C 
A C B D 
A C D B 
A D C B 
A D B C 

但我將不得不擴展它的10個城市。人們告訴我,它會使用9個福爾循環,但我不能夠發展它=(

有人可以給我一個想法?

+1

「無功能」得到什麼?一個非常愚蠢的騙子straint。通過暴力解決旅行商問題也是如此。 –

+0

您將如何爲10個城市生成所有1長組合?一個產生所有城市的for-loop。現在,對於兩個城市來說,這是一個超過10個城市的循環,以獲得第一個城市,每個「第一個」城市在其他城市循環獲得第二個城市組合。長達3年的時間裏,每個城市的10個城市都是其他城市的2長組合......等等,最多10 –

+1

@EugeneSh,這是一項任務。重點在於寫C,而不是有效解決旅行商問題。 –

回答

1

延伸到10(及仰視城市名)作爲一個練習留給讀者。它是可怕的,但是這就是你和你的教授的侷限性

#include <stdio.h> 

int main(void) { 
    for (int one = 0; one < 4; one++) { 
     for (int two = 0; two < 4; two++) { 
      if (two != one) { 
       for (int three = 0; three < 4; three++) { 
        if (one != three && two != three) { 
         for (int four = 0; four < 4; four++) 
          if (one != four && two != four && three != four) { 
           printf("%d %d %d %d\n", one, two, three, four); 
          } 
        } 
       } 
      } 
     } 
    } 
    return 0; 

} 
+0

呃哦,我看到一個'main'函數?違反!!! – yano

+0

我很確定這個任務會說「主體中沒有任何功能」,或者什麼東西,或者它將成爲一個無法回答的任務! –

+0

而且,是的,'printf'是一個函數,但真正的答案不需要'printf'。雖然我不知道它會如何顯示結果! –

0

這是基於https://stackoverflow.com/a/3928241/5264491

#include <stdio.h> 

int main(void) 
{ 
    enum { num_perm = 10 }; 
    int perm[num_perm]; 
    int i; 

    for (i = 0; i < num_perm; i++) { 
     perm[i] = i; 
    } 

    for (;;) { 
     int j, k, l, tmp; 

     for (i = 0; i < num_perm; i++) { 
      printf("%d%c", perm[i], 
        (i == num_perm - 1 ? '\n' : ' ')); 
     } 

     /* 
     * Find largest j such that perm[j] < perm[j+1]. 
     * Break if no such j. 
     */ 
     j = num_perm; 
     for (i = 0; i < num_perm - 1; i++) { 
      if (perm[i + 1] > perm[i]) { 
       j = i; 
      } 
     } 
     if (j == num_perm) { 
      break; 
     } 

     for (i = j + 1; i < num_perm; i++) { 
      if (perm[i] > perm[j]) { 
       l = i; 
      } 
     } 

     tmp = perm[j]; 
     perm[j] = perm[l]; 
     perm[l] = tmp; 

     /* reverse j+1 to end */ 
     k = (num_perm - 1 - j)/2; /* pairs to swap */ 
     for (i = 0; i < k; i++) { 
      tmp = perm[j + 1 + i]; 
      perm[j + 1 + i] = perm[num_perm - 1 - i]; 
      perm[num_perm - 1 - i] = tmp; 
     } 
    } 
    return 0; 
} 
相關問題