C - 2D阵列 - 幻方阵4

时间:2012-11-01 12:11:18

标签: c multidimensional-array magic-square

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整除。

我提供的算法是

  1. 遍历数组并填充对角线子集
  2. 向后遍历数组并填写其余部分
  3. 我用上面的代码完成了4x4数组,这扩展到了8x8,12x12等。 但是我坚持第1部分这是填写对角线子集(例如将8x8拆分为4x4而取代对角线)...我不是确定如何做到这一点,只设法填补对角线本身

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

    tldr,上面是我用来知道它是否是对角线的条件,任何建议我如何改变条件以知道它是否是对角线子集不是对角线?

    由于

1 个答案:

答案 0 :(得分:0)

根据我对您链接的教程的理解,您希望将矩阵拆分为16个相等的子矩阵,并填充这些子矩阵中的对角线。因此,对于8x8矩阵,您需要实现:

 |   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  _

这里的子矩阵是2x2,如果矩阵是12x12,它将被细分为16个3x3的子矩阵。

如果您使用这些子矩阵作为索引来查找对角线(即i == j),您可以使用以下表达式:

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

w = n/4,即方形子矩阵的顺序(对于8x8,这是2)。因此i/w将说明当前矩阵索引i所在的子矩阵(0到3)。