回 帖 发 新 帖 刷新版面

主题:魔方阵的解法,奇数阶和偶数阶。

http://163.20.91.130/sct/content/1972/00100034/0014.htm

这里有魔方阵的演算方法,C++代码见后帖~~~

___

今天写出了阶数是4的倍数的C++代码(其实C也一样可用),完全根据上面的那篇文章的方法写出,代码如果看不明白的话就看那篇文章.
阶数是4K+2(K为整数)的解法正在思考中....

回复列表 (共13个回复)

沙发

厉害!能找到这么不错的网站!![em1][em1]

板凳

根据上一篇帖子的方法,刚刚写出了N阶魔方阵的C++代码(N为奇数),大家指正一下~~
算法全在上面提到的文章里,代码只是运用了几次循环,看不懂代码的就看一下那篇帖子。
/*N阶魔方阵*/
#include <iostream.h>
#include <conio.h>
#define N 99 //最大阶数,根据需求而改变此值。试了一下阶数为1023和1024,大约要一分钟才能显示完毕.

int a[N][N];//定义全局数组
void mfz1(int);
void main()
{
int n;
cin>>n;
if (n%2!=0) mfz1(n);
if (n%4==0) mfz2(n);//写出了阶数为4的倍数的函数,主函数做修改
for (int i=1;i<=n;i++)
    {for (int j=1;j<=n;j++)
        cout<<a[i][j]<<'\t';//输出魔方阵
    cout<<endl;}
getch();
}


void mfz1(int n)
{int i,j;//定义数组下标
i=(n+1)/2-1;j=(n+1)/2;
int x,y,z;
for (x=0;x<n;x++)
{i+=2;
  if (i>n) i-=n;
  for (y=x*n+1;y<x*n+n;y++)
  {a[i][j]=y;
   i++;j++;
   if (i>n) i-=n;
   if (j>n) j-=n;}
   a[i][j]=y;
  }
}

3 楼

偶数的比较难一点

4 楼

当阶数为4的倍数时,用这个函数求解
主函数见上面的帖子.
void mfz2(int n)
{int i,j;
for (i=1;i<=n/2;i++)
  for (j=1;j<=n/2;j++)
    if ((i+j)%2) a[i][j]=n*n+1;
    else a[i][j]=0;
for (i=1;i<=n/2;i++)
  for (j=n/2+1;j<=n;j++)
    if ((i+j)%2) a[i][j]=0;
    else a[i][j]=n*n+1;
for (i=n/2+1;i<=n;i++)
  for (j=1;j<=n/2;j++)
    if ((i+j)%2) a[i][j]=0;
    else a[i][j]=n*n+1;
for (i=n/2+1;i<=n;i++)
  for (j=n/2+1;j<=n;j++)
    if ((i+j)%2) a[i][j]=n*n+1;
    else a[i][j]=0;
int sum=1;
for (i=1;i<=n;i++)
  for (j=1;j<=n;j++)
    {if (a[i][j]) a[i][j]=a[i][j]-sum;
     else a[i][j]=sum;
     sum++;}

}

5 楼

将上面的四个循环合四为一,只是条件的判定有点长了~~
void mfz2(int n)
{int i,j;
for (i=1;i<=n;i++)
  for (j=1;j<=n;j++)
    if ((i<=n/2 && j<=n/2 && (i+j)%2)||(i>n/2 && j>n/2 && (i+j)%2)
         ||(i<=n/2 && j>n/2 && !((i+j)%2))||(i>n/2 && j<=n/2 && !((i+j)%2)))
         a[i][j]=n*n+1;
    else a[i][j]=0;
int sum=1;
for (i=1;i<=n;i++)
  for (j=1;j<=n;j++)
    {if (a[i][j]) a[i][j]=a[i][j]-sum;
     else a[i][j]=sum;
     sum++;}
}

6 楼


[img]http://album2.chinaren.com/alushare/file/69/28/562869/57036.jpg[/img]

7 楼

我有一个现成的程序,是好几年前参考一本数学书介绍的算法用C写的,可以计算任意n阶魔方阵。

8 楼

那麻烦帖出来学习一下吧?谢谢~~
我还没想到4K+2阶的怎么写....

9 楼

/****求N阶魔方阵:就是N阶矩阵的每一行和每一列相加和都相等*****/
#include <iostream.h>
#include <iomanip.h>
#define N 7
void main()
{
int a[N+1][N+1];
int i,j,k,l=0;
for(i=0;i<=N;i++)
    for(j=0;j<=N;j++)
        a[i][j]=0;
i=1;
j=N/2+1;
a[i][j]=1;
for(k=2;k<=N*N;k++)
    {
     if((k-1)%N==0)
        i++;
     else
        {
         if(i==1) i=N;
         else i--;
         if(j==N) j=1;
         else j++;
        }
     a[i][j]=k;
    }
for(i=1;i<=N;i++)
    for(j=1;j<=N;j++)
        {
         cout<<setw(4)<<a[i][j];
         l++;
         if(l%N==0)
            cout<<endl;
        }
}


10 楼

0 223 245 267 289 311 333 355 377 399   1  23  45  67  89 111 133 155 177 199

222 244 266 288 310 332 354 376 398  20  22  44  66  88 110 132 154 176 198 220

243 265 287 309 331 353 375 397  19  21  43  65  87 109 131 153 175 197 219 221

264 286 308 330 352 374 396  18  40  42  64  86 108 130 152 174 196 218 240 242

285 307 329 351 373 395  17  39  41  63  85 107 129 151 173 195 217 239 241 263

306 328 350 372 394  16  38  60  62  84 106 128 150 172 194 216 238 260 262 284

327 349 371 393  15  37  59  61  83 105 127 149 171 193 215 237 259 261 283 305

348 370 392  14  36  58  80  82 104 126 148 170 192 214 236 258 280 282 304 326

369 391  13  35  57  79  81 103 125 147 169 191 213 235 257 279 281 303 325 347

390  12  34  56  78 100 102 124 146 168 190 212 234 256 278 300 302 324 346 368

  11  33  55  77  99 101 123 145 167 189 211 233 255 277 299 301 323 345 367 389

  32  54  76  98 120 122 144 166 188 210 232 254 276 298 320 322 344 366 388  10

  53  75  97 119 121 143 165 187 209 231 253 275 297 319 321 343 365 387   9  31

  74  96 118 140 142 164 186 208 230 252 274 296 318 340 342 364 386   8  30  52

  95 117 139 141 163 185 207 229 251 273 295 317 339 341 363 385   7  29  51  73

116 138 160 162 184 206 228 250 272 294 316 338 360 362 384   6  28  50  72  94

137 159 161 183 205 227 249 271 293 315 337 359 361 383   5  27  49  71  93 115

158 180 182 204 226 248 270 292 314 336 358 380 382   4  26  48  70  92 114 136

179 181 203 225 247 269 291 313 335 357 379 381   3  25  47  69  91 113 135 157

200 202 224 246 268 290 312 334 356 378 400   2  24  46  68  90 112 134 156 178

我来回复

您尚未登录,请登录后再回复。点此登录或注册