注册 登录
编程论坛 C++教室

求"奇数幻方阵"程序

raohuaren 发布于 2007-09-19 20:58, 1647 次点击
编程:实现小于十阶的任意奇数幻方阵.所谓"奇数幻方阵"是指:对奇数n,用1、2、3、。。。n*n组成一个n×n阶方阵,使每一行每一列以及每一个对角线上的所有元素之和均相等,为n(n*n+1)/2,如
6 1 8
7 5 3
2 9 4
奇数幻方阵的算法:
1) 首先确定第一个数的位置,它在第一行的中间
2) 下一个数的位置在当前数的左上方,即行号减1,列号减1:
* 若该位置行号小于1,则放在该列最后一行;
*若该位置列号小于1,则放在该行最后一列;
*若该位置行列号均小于1,或若该位置已有数,则放在当前数的正下方;
3)重复2),直到所有数都一放好;
9 回复
#2
雨中飞燕2007-09-19 21:02
你都有算法了,自己写出来不就行了吗?????



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
#3
HJin2007-09-19 23:16
回复:(raohuaren)求

/*---------------------------------------------------------------------------
File name: 奇数幻方阵.c
Author: HJin (email: fish_sea_bird [at] yahoo [dot] com )
Created on: 9/19/2007 07:31:09
Environment: Windows XP Professional SP2 English +
Visual Studio 2005 v8.0.50727.762


Modification history:
===========================================================================


Problem statement:
---------------------------------------------------------------------------

https://bbs.bc-cn.net/viewthread.php?tid=171321

奇数幻方阵的算法:
1) 首先确定第一个数的位置,它在第一行的中间
2) 下一个数的位置在当前数的左上方,即行号减1,列号减1:
* 若该位置行号小于1,则放在该列最后一行;
*若该位置列号小于1,则放在该行最后一列;
*若该位置行列号均小于1,或若该位置已有数,则放在当前数的正下方;
3)重复2),直到所有数都一放好;
*/

#include <stdio.h>
#include <stdlib.h>

#define MAX 101
int a[MAX][MAX];

int main()
{
int i, j, n, c, n2;

while (scanf("%d", &n) == 1)
{
if (n == -1)
{
break;
}

if ((n& 1) == 0)
{
puts("n must be an odd integer");
continue;
}

for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
a[i][j] = 0;
}
}

i = 1;
j = n / 2+1;
a[i][j] = 1;

n2 = n * n;
for (c = 2; c <= n2; ++c)
{
--i;
--j;

if ((i < 1 && j < 1) || (a[i][j] != 0))
{
i += 2;
++j;
}
else if (i < 1)
{
i = n;
}
else if (j < 1)
{
j = n;
}

a[i][j] = c;
}

for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
printf("%-4d ", a[i][j]);
}
printf("\n");
}
}

return 0;
}

#4
雨中飞燕2007-09-19 23:23
HJin的源码看起来比较长。。。。



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
#5
HJin2007-09-19 23:29
Hi sister:

Your turn --- still have time before you sleep.
#6
雨中飞燕2007-09-20 00:15
#include <stdio.h>
#define MAX 101
int main(void)
{
long nList[MAX][MAX],n=0,n1,n2;
while(!(n&1)){scanf("%d",&n);} //输入阶数
for(n2=n*n,n1=0;n1<n2;n1++) //计算生成
{
nList[(n1*(n-1)+(n1/n)*2)%n][(n1+(n>>1)-n1/n)%n]=n1+1;
}
for(n2=0;n2<n;n2++) //结果输出
{
for(n1=0;n1<n;n1++)printf("%4d",nList[n2][n1]);
printf("\n");
}
return 0;
}



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/

[此贴子已经被作者于2007-9-20 0:15:44编辑过]

#7
xlh52252007-09-20 13:49

应该写的面向对象一点,程序不具括展性,只顾解决问题`~~~

#8
aipb20072007-09-20 16:02
6楼很强,不过还是喜欢读4楼的
#9
raohuaren2007-09-20 23:03
都是高手 啊,我初学....学习中,谢了哈
#10
王振兴2007-10-12 20:16

我也写了一个,可能我的还能简单点。。。。自己懒得改了!
#include<iostream.h>
#include<math.h>

#define N 9
#define m 3


void fun(int a[], int b[][m])
{
int i=0,k=m/2;
int j = 0;
while(j<N)
{
if(j==0)
{
b[i][k] = a[j++];
i--,k--;
continue;
}
if((i<0 && k<0) || (i>=0 && k>=0 && b[i][k]))
{
i += 2;
k++;
b[i][k] = a[j++];
i--,k--;
}
else
{
if(i<0)
{
i = m-1;
b[i][k] = a[j++];
i--,k--;
}
else
if(k<0)
{
k = m-1;
b[i][k] = a[j++];
i--,k--;
}
else
{
b[i][k] = a[j++];
i--,k--;
}
}
}
}

void show(int b[][m])
{
int i,j;
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
cout << b[i][j] << '\t';
cout << endl;
}
}

void main()
{
int a[N] = {1,2,3,4,5,6,7,8,9};
int b[3][3]={0};
fun(a,b);
show(b);
}

1