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整除。
我得到的算法是
我已经用上面的代码完成了4x4数组,它扩展到8x8,12x12等等,但是我是卡在第1部分),它是填充对角线子集(例如,将8x8分解成4x4,然后取那个对角线).我不知道该如何做,只是设法填充对角线本身
if( i=j || j=(n-1-i) ){tldr,上面是我用来知道它是否是对角线的条件,有什么建议我可以改变条件来知道它是否是对角线子集而不是对角线?
谢谢
发布于 2012-11-02 12:51:32
根据我从教程中了解到的,你希望把你的矩阵分解成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)中。
https://stackoverflow.com/questions/13176801
复制相似问题