我正在尝试开发一个代码来解决C中的旅行商问题,但我有一些限制:我只能使用" for," while",&#34 ; do",数组,矩阵和简单的东西,所以,没有函数或递归(不幸的是)。
到目前为止我得到了什么:
用户将按如下方式键入城市坐标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个城市,所以&#34;我&#34;从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个嵌套的foor循环,但是我无法开发它=(
有人可以给我一个想法吗?
答案 0 :(得分: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;
}
答案 1 :(得分: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;
}