2016-05-13 109 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; 
}