C语言:输出魔方阵
这个题目是谭浩强的C程序设计的第五版。。就是那本封面是绿的。。很环保的颜色。。看起来很容易。。实际上也很容易。。原题是:输出“魔方阵”。所谓魔方阵就是指这样的方阵,它的每一行,每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出由1~n的平方之间的自然数构成的魔方阵。。从理论上来说,这个题目是用回溯的知识来做的(此乃寡人之陋见也,可视之为放p)。。谭浩强哥哥的c程序设计的用户一般是那种刚学程序的比较垃圾的人(就像我)。。对于初学者,对于刚学的人,他们对数据结构和算法的了解还是比较浅的。。叫他们写这个。。勉强了点吧。。虽然我比较伟大,写的出来,但是这并不代表每个人都这么伟大呀。。不知道谭浩强哥哥是怎么想的。。或者是我实在是比较垃圾,有什么简单的算法没想到。。大家帮我想想吧。。
注意:不要告诉我用n个for循环的嵌套做。。你会被我扁的。。简直是折磨计算chicken
答案:魔方阵,古代又称“纵横图”,是指组成元素为自然数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的下面;
有点靠气。。百度一下你就知道。。
http://www.douyou123.cn/province/index.htm 这是编程网站大全,我是在这自学的,你也可以看看这个是纵横图,对于n是奇数的话,有规律的,有直接算法,你在问问上搜下也可以,我写了好几次了。直接百度更快。对于n是偶数的话,貌似还没有规律。你去搜下纵横图算法吧。
有一个问题,n个for循环,写不出来吧。。
而n个for循环其实就是用回溯法做出来的。。回溯法可以表示n次循环
n个循环嵌套来做我还做不来呢。。。但至少用一个循环来赋值,一个循环来输出,这两个循环是不嵌套的。。这是用“右上方”原则做的,判断倒是比较多,如果要求更多阶的魔方阵的话就把#define N 3这句话里面的3改成别的数字。
#include<stdio.h>
#define N 3
void main()
{int a[N][N]={0},i,j,k;
i=0; j=N/2; a[i][j]=1;
for(k=2;k<=N*N;k++)
{i=i-1; j=j+1;
if(i<0&&j==N)
{i=i+2;j=j-1;}
else
{if(i<0) i=N-1;
if(j==N) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else {i=i+2; j=j-1; a[i][j]=k;}
}
printf("%d阶魔方阵为:\n",N);
for(i=0;i<N;i++)
{for(j=0;j<N;j++) printf("%4d",a[i][j]);
printf("\n");
}
}
上一个:C语言跟C++有什么分别?
下一个:十天学会单片机和C语言编程