【问题标题】:C - 2D Array - Magic Square order 4C - 2D 阵列 - 魔方 4 阶
【发布时间】:2012-11-01 12:11:17
【问题描述】:
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. 向后遍历数组并填写其余部分

我已经用上面的代码完成了 4x4 数组,它扩展到 8x8、12x12 等。 但我卡在第 1 部分),即填写对角线子集(例如,将 8x8 拆分为 4x4 并取该对角线)...我不是确定怎么做,只设法填充对角线本身

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

tldr,以上是我用来知道它是否是对角线的条件,有什么建议我可以更改条件以知道它是否是对角线子集而不是对角线?

谢谢

【问题讨论】:

  • 关于您发布的代码的注释:i=j || j=(n-1-i) 涉及分配 ij。我想您想与==i==j || j==(n-1-i) 进行比较?
  • 请为您的编译器打开基本警告。一旦它们打开,就把它们当作错误对待。如果您收到不想修复的警告,请使用编译器选项禁用该警告。任何警告都是潜在的bug,如果你采取0警告策略,你不需要用思考能力去思考警告是否可以。它可以帮助你保持理智!
  • 哦,是的,我想进行比较,在复制时错误地更改了它。那不是问题,我想要一个逻辑表达式来评估它是否落入对角线子集而不仅仅是对角线。例如对于 8x8 分为 16 个部分并使用填充这些部分的对角线
  • 我仍然对什么是对角线子集感到困惑——您能否进一步解释一下,或者举例说明您希望选择 8x8 矩阵中的哪些索引?

标签: c multidimensional-array magic-square


【解决方案1】:

根据我从您链接的教程中了解到的情况,您希望将矩阵拆分为 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)中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 2014-05-25
    • 2021-02-02
    • 2018-05-14
    • 2017-07-17
    • 1970-01-01
    • 2023-04-03
    • 2017-12-31
    相关资源
    最近更新 更多