2013-02-06 279 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 ...)一些東西,你會看到,是真的經過深思熟慮的無邊解決所有圖形問題(或大多數問題)。

希望這會有所幫助。祝你好運!