问题描述
- 怎么写啊,小白想不出来,求大神
-
幻方是在一个n*n的矩阵中放置从1到n 2 的数,每个数只出现一次,并且在每行,每列及对角线的和是一样的。 这个问题的焦点是奇数幻方,它意味着n是奇数,你将使用下面的方法来构造奇幻方阵,最基本的规律是向右上角移动,下面让我们一步一步进行。1、让我们开始在最上面的一行的中间放上1(在这个例中n=3) 你的任务是写一个程序去找出哪个数会被放到右下角在n幻方中,当然,你可以使用上面的规律去构造幻方。
2、我们假定最后一行是第一行的上一行,向右上角移动意思是向上移一行并且向右移一列,因此2就放置到最后一行的最后一列上。
3、同样,在最右边的列再向右移时,我们认为第1列为其最右边的列,因此3必须放置到最左边的一列上,并且向上移一行.
4、当向右上角放数时,该处已放置了数该怎办呢?当这种情况发生时,这个规律就在该次放弃一次,向右上角移的规律用直接向下放置的来代替,因此4会被放到3的下面。
5、然后:
6、6在最右上角,7正常会放到最后一行上,又因6是最右边,7正常位置应该是最左边,这个位置是左下角,这个位置方法放置7,不幸的是,这里已放置了4,因此7只能入到6的下面。
8 1 6
3 5 7
4 9 2Input
输入n(n<100)
当输入为0时结束。
Output
对每个n,你需输出对应的幻方。每行两个数字之间有一个空格
Sample Input
3
5
0Sample Output
8 1 6
3 5 7
4 9 2
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
解决方案
http://www.cnblogs.com/qianyaoyuan/archive/2013/03/30/2990058.html
解决方案二:
http://blog.csdn.net/yinxusen/article/details/5274540
解决方案三:
#include
#include
#include
void OddArr(int n)
{
int **a = (int **)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
a[i] = (int *)malloc(sizeof(int)*n);
i=0;
int j=n/2,m;
for(m=1;m<=n*n;m++)
{
a[i][j] = m;
if(m%n != 0)
{
i--;
j++;
if(i<0) i=i+n;
if(j==n) j=n-j;
}
else
{
i++;
if(i==n) i=n-i;
}
}
for( i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("n");
}
}
void main(){
int n;
scanf("%d",&n);
while(n%2==1)
{
OddArr(n);
scanf("%d",&n);
}
}