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、上記は対角かどうかを知るために使用する条件です。対角ではなく対角サブセットであるかどうかを知るために条件を変更する方法はありますか?
ありがとう