[分享]写之前奇数阶幻方想法
所谓幻方(最基本的那种),就是横,竖,对角线上的数的和等于一个常数的数字方阵4 3 8
9 5 1
2 7 6
#include<stdio.h>
int main()
{
int i;
const int N=5;
for(i=1;i<2*N;i++)
{
printf("%d ",(N+(i>N ?2*N-i:i-N?i:0)*(i%N>N/2 ?1 :-1)));
if(!(i%3))
putchar('\n');
}
scanf("%d",i);
}
int main()
{
int i;
const int N=5;
for(i=1;i<2*N;i++)
{
printf("%d ",(N+(i>N ?2*N-i:i-N?i:0)*(i%N>N/2 ?1 :-1)));
if(!(i%3))
putchar('\n');
}
scanf("%d",i);
}
(N+(i>N ?2*N-i:i-N?i:0)*(i%N>N/2 ?1 :-1))怎样得出
4 3 8
9 5 1
2 7 6
将矩阵展开并要要求结果:
4 3 8 9 5 1 2 7 6
通过下面的关系,想办法合成上面的数列
i 会生成 1 2 3 4 5 6 7 8 9
想办法生成
1 2 3 4 5 4 3 2 1 // i>N ?2*N-i: (i-N?i:0) 这个特别处理一个5
i>N ?2*N-i: (i-N?i:0) //用大括号目的就是省得麻烦,不用考虑优先级如何
等价:
if( (i-N) != 0 )
temp = i //可以理解系统建一个临时变量参与运算,在程序中不可见
else
temp = 0
if( (i>N) != 0)
temp_1 = 2*n - i; //可以理解系统建一个临时变量参与运算,在程序中不可见
else
temp_1 = temp;
然后同这个5结合
5 5 5 5 5 5 5 5 5
大家从中看作什以规律出来
(5-1) (5-2) (5+3) (5+4) (中间特别处理) (5-4) (5-3) (5+2) (5+1)
关键处理符号问题
- - + + ? - - + +
这里有什么办法生成这个这些符号关系,就利用+/-1去解决
-1 -1 1 1 ? -1 -1 1 1
再同 1 2 3 4 5 4 3 2 1 //上下两者相乘
得出 -1 -2 -3 -4 5 -4 -3 2 1 // (i%N>N/2 ?1 :-1)));
(i%N>N/2 ?1 :-1)));
等价:
if( i%N > N/2)
temp_3 = 1; //可以理解系统建一个临时变量参与运算,在程序中不可见
else
temp_3 = -1;
得出 4 3 8 9 ? 1 2 7 6 // i>N ?2*N-i: (i-N?i:0) 这个特别处理一个5
最后生成
4 3 8 9 5 1 2 7 6
PS: 建意建草稿,将你的想法写草构上,想办法如何去实现,草稿最好工整,不然那些规律就不出来。
有什么不明白地方可以提问!
[ 本帖最后由 点线面 于 2011-1-9 22:28 编辑 ]