2012-11-01 53 views
2
114 void fillDoubly(int square[20][20], int n){ 
115 
116  int i, j, k=0, l=0, counter=0, test[400]={0}, diff=n/4-1; 
117 
118  for(i=0;i<n;i++) //first nested for loops for part 1) 
119   for(j=0;j<n;j++){ 
120    counter++; 
121    if(i=j || j=(n-1-i)){ 
122     { 
123      square[i][j] = counter; 
124      test[counter-1] = 1; 
125     } 
126    } 
127   } 
128 
129  for(i=n-1;i>=0;i--) // for part 2) 
130   for(j=n-1;j>=0;j--){ 
131    if(square[i][j]==0){ 
132     while(test[k]!=0){ 
133      k++; 
134     } 
135     test[k]=1; 
136     square[i][j]=k+1; 
137    } 
138   } 
139 } 

所以基本上,我不得不產生幻方的4階 即行和列除盡4.Ç - 二維數組 - 幻方爲了4

我提供的算法是

  1. 遍歷陣列和在對角的子集填充
  2. 向後遍歷數組和在靜止
01填

我已經做了與上面的代碼的4×4陣列,這延伸到8x8,12x12等 但我停留在部分1)這是填充在對角線子集(例如分裂成8×8×4,並採取對角代替)......我不知道該怎麼做,只設法在對角線本身填補

if(i=j || j=(n-1-i)){ 

tldr,以上是我用它來知道如果條件它的對角線,任何建議如何我可以改變條件知道它是否是對角子集不是對角線?

感謝

+0

關於您發佈的代碼的說明:'i = j || j =(n-1-i)'涉及'i'或'j'的分配。我想你想用'=='做比較,即'i == j || j ==(n-1-i)'? – imp25

+0

請打開編譯器的基本警告。一旦他們開始,把他們當成錯誤。如果您收到警告而您不想修復,請使用編譯器選項禁用該警告。任何警告都是潛在的錯誤,如果您採取0警告政策,您不需要在思考警告是否正確時使用思維能力。它有助於保持你的理智! – hyde

+0

可能的重複http://stackoverflow.com/questions/4372554/magic-square-program-c。 –

回答

0

從我從你鏈接您想將矩陣分爲16只相等的小矩陣,並填寫採取翻過這些小矩陣對角線教程理解。因此,對於一個8×8矩陣你想才達到:

| 0 | 1 | 2 | 3 | _ 
0001 0002 0000 0000 0000 0000 0007 0008 0 
0009 0010 0000 0000 0000 0000 0015 0016 _ 
0000 0000 0019 0020 0021 0022 0000 0000 1 
0000 0000 0027 0028 0029 0030 0000 0000 _ 
0000 0000 0035 0036 0037 0038 0000 0000 2 
0000 0000 0043 0044 0045 0046 0000 0000 _ 
0049 0050 0000 0000 0000 0000 0055 0056 3 
0057 0058 0000 0000 0000 0000 0063 0064 _ 

這裏的子陣2×2,如果矩陣是12×12,將它劃分爲3×3的16個子陣。

如果使用這些小矩陣作爲與索引找到對角線(即我== j)的,你可以使用表達式:

if((i/w)==(j/w) || (j/w)==(3-(i/w))) 

w = n/4,這是你的方塊子矩陣的順序( 8x8,這是2)。因此i/w將聲明當前矩陣索引i位於哪個子矩陣(0到3)中。