2013-02-06 224 views
0

我正在研究遗传算法和C编程语言。我的任务是读取表示连通图的矩阵,然后根据节点之间的距离计算适应度,教授已经明确表示这不一定是确切的,也不一定遵循图上的约束条件。所以我的想法是将矩阵读入到可以工作的2D数组中。我现在需要将2D阵列放入一维阵列中,我们将调用机架,然后我们将机架混乱并将其分成两个等长的较小阵列。c中的二维到一维数组

矩阵为20 * 20,机架必须是尺寸400

不管怎么说,这是我做这个代码,虽然这是行不通的。

void TwoDtoOneD(int array[][SIZE], int left[SIZE*SIZE]){ 
    int i,j; 
    for(i=0;i<SIZE*SIZE;i++){ 
     for(j=0;j<SIZE*SIZE;j++){ 
      left[i] = array[i][j]; 
     }//end for 
    }//end for 
} 
+0

您需要第三个变量k来计算'left [k ++]'的索引,而不是'left [i]' – Floris

回答

0

left[j+i*SIZE] = array[i][j]

走在左边的每个条目如何与循环充满逻辑,则担心这会让阵列数据,只要你想。

0

通过执行两个步骤并使它们迭代直到SIZE^2,您会使array[i]重复太多。 i应该只能运行到20(或SIZE),这是您矩阵的最大ij。 为了做到这一点,您需要第三个变量,每当您将值更改为向量时(左侧),该变量都会增加,并且此变量与for循环变量的初始化无关。

所以,你的例子,这将是这样的:

void TwoDtoOneD(int array[SIZE][SIZE], int left[SIZE*SIZE]){/
    int i,j,k; 
    k=0; 
    for(i=0;i<SIZE;i++){ 
    for(j=0;j<SIZE;j++){ 
     left[k] = array[i][j]; 
     k++; 
    }//end for 
    }//end for 
} 

现在,您left[]阵列有k+1元素,你可以通过它,直到k迭代。

刚刚完成,因为你用图表的工作,试图了解图形路径算法(Dijkstra'sPrim'sFloyd'sJohnson's ...)一些东西,你会看到,是真的经过深思熟虑的无边解决所有图形问题(或大多数问题)。

希望这会有所帮助。祝你好运!