鞍点:在一个数组中找到一行中最大的数,但它又是这一列中最小的数!就是鞍点。也可以没有~!
魔方:就是在一个数组中,它的每一行,每一列,和对角线之和均等,例如:
8 1 6
3 5 7
4 9 2
要求打印出由1到N的平方的自然数构成的魔方阵
[此贴子已经被作者于2004-07-18 14:22:56编辑过]
幻方的程序:
#include <stdio.h>
#define n 5
main()
int magic[n][n]={0};
int i,j,k,s=1;
magic[1][n/2]=1;
for(i=1,j=n/2,k=1;k<(n-2)*(n-2);i--,j++,k++)
{if(i==1&&j!=n-2) i=n-1;
else if((i==1&&j==n-2)||magic[i-1][j+1!=0) {i+=2;j-=1;}
else if(i!=1&&j==n-2) j=0;
magic[i-1][j+1]=s+1;
}
for(i=1;i<n-1;i++)
{
for(j=1;j<n-1;j++)
printf("%5d",magic[i][j]);
printf("\n");
}
}
首先,这个程序只能算N为奇数的情况,偶数的方法正在回忆中,这些高中老师都是讲过的~
其次,我根本不清楚晴天的程序在干什么~所以,我还是把我的算法贴了出来
再次,以后这么难的题目换个地方发啊~想了我一个早上,头都大了!
由于对程序的修修补补,格式方面难免有疏忽,而且具体计算过程早就乱七八糟,可以说是我打了七八次补丁才修补好的~请见谅~
奇数的计算方法:
例子:边长为3的幻方填写过程(该过程只适用于奇数幻方)
① 1必须填写在第一行的中间
② 然后斜向左上按顺序写N个(N的取值为幻方之边长)这里取为3。
请注意,因为1所在的位置为顶行,再向上即超出范围,超出的范围从下面开始。所以2就放在了左下角。同理,当超出上下左右边界时候,即从另一头算起。
6 | 1 | 8 |
7 | 5 | 3 |
2 | 9 | 4 |
③ 然后取3的下面一格为4的位置,并重复①到③的过程写入4~9
好~完成了!
大家如果有兴趣的话,可以自己推算出5,7,9等等奇数的幻方。偶数的我正在回忆中,说不定可以去问问老师….郁闷….