标题:幻方矩阵或魔方矩阵的思路!
只看楼主
aihuaqiong
Rank: 2
等 级:论坛游民
帖 子:17
专家分:16
注 册:2009-10-21
结帖率:100%
 问题点数:0 回复次数:1 
幻方矩阵或魔方矩阵的思路!
幻方矩阵或魔方矩阵,每行每列之和都相等!
用C的解题思路,有什么规律?
搜索更多相关主题的帖子: 魔方 
2009-10-28 13:59
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
得分:0 
魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
如3×3的魔方阵:
   8 1 6
   3 5 7
   4 9 2   
魔方阵的排列规律如下:  
(1)将1放在第一行中间一列;  
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);  
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1; (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;  (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
程序代码:
# include <stdio.h> 
int main(void) 
{ 
 int i,j,n,k,a[100][100]={0}; 
 
 do{ 
    printf("n="); 
    scanf("%d",&n); 
   }while(n<3||n%2==0); 
 
 for(i=0,j=n/2,k=1;k<=n*n;k++) 
   { 
    a[i][j]=k; 
    if(a[i+(i!=0?-1:n-1)][j+(j!=n-1?1:-j)]) /* 判断下个存放的位置是否被占 */ 
       i++; 
    else                         /* 如下个位置没被占,指向下个位置 */ 
       i=i!=0?i-1:n-1,j=j!=n-1?j+1:0; 
   } 
 
 for(i=0;i<n;i++)     /* 输出 */ 
   {for(j=0;j<n;j++) 
      printf("%5d",a[i][j]); 
    printf("\n\n"); 
   } 
 getch(); 
 return 0; 
}

努力—前进—变老—退休—入土
2009-10-28 15:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-290224-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.130130 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved