主题:魔方阵的解法,奇数阶和偶数阶。
有事找我请烧钱
[专家分:500] 发布于 2004-04-13 21:15:00
http://163.20.91.130/sct/content/1972/00100034/0014.htm
这里有魔方阵的演算方法,C++代码见后帖~~~
___
今天写出了阶数是4的倍数的C++代码(其实C也一样可用),完全根据上面的那篇文章的方法写出,代码如果看不明白的话就看那篇文章.
阶数是4K+2(K为整数)的解法正在思考中....
回复列表 (共13个回复)
沙发
有一天 [专家分:50] 发布于 2004-04-12 13:54:00
厉害!能找到这么不错的网站!![em1][em1]
板凳
有事找我请烧钱 [专家分:500] 发布于 2004-04-12 14:19:00
根据上一篇帖子的方法,刚刚写出了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 楼
woshihanjin [专家分:2510] 发布于 2004-04-12 14:24:00
偶数的比较难一点
4 楼
有事找我请烧钱 [专家分:500] 发布于 2004-04-13 21:13:00
当阶数为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 楼
有事找我请烧钱 [专家分:500] 发布于 2004-04-13 21:48:00
将上面的四个循环合四为一,只是条件的判定有点长了~~
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 楼
有事找我请烧钱 [专家分:500] 发布于 2004-04-13 22:40:00
[img]http://album2.chinaren.com/alushare/file/69/28/562869/57036.jpg[/img]
7 楼
slot1 [专家分:3880] 发布于 2004-04-13 22:55:00
我有一个现成的程序,是好几年前参考一本数学书介绍的算法用C写的,可以计算任意n阶魔方阵。
8 楼
有事找我请烧钱 [专家分:500] 发布于 2004-04-13 22:58:00
那麻烦帖出来学习一下吧?谢谢~~
我还没想到4K+2阶的怎么写....
9 楼
板刷西西 [专家分:0] 发布于 2004-04-26 16:53:00
/****求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] 发布于 2004-04-26 16:56:00
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
我来回复