C – 2Darrays – 幻方阵4

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=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. 向后遍历arrays并填补其余部分

我已经使用上面的代码完成了4x4arrays,这扩展到了8×8,12×12等,但我仍然坚持第1部分 ,这是填充对角线子集 (例如,将8×8分成4×4并取代对角线)。 ..我不知道该怎么做,只能设法填补对角线本身

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

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

谢谢

根据我对您链接的教程的理解,您希望将矩阵拆分为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,它将被细分为16个3×3的子矩阵。

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

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

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