标题:求"奇数幻方阵"程序
只看楼主
raohuaren
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-9-19
 问题点数:0 回复次数:9 
求"奇数幻方阵"程序
编程:实现小于十阶的任意奇数幻方阵.所谓"奇数幻方阵"是指:对奇数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),直到所有数都一放好;
搜索更多相关主题的帖子: 方阵 奇数 
2007-09-19 20:58
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
得分: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-09-19 21:02
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
回复:(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:
---------------------------------------------------------------------------

http://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;
}


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-09-19 23:16
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
得分:0 
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/
2007-09-19 23:23
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
Hi sister:

Your turn --- still have time before you sleep.

I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-09-19 23:29
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
得分:0 
#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编辑过]

2007-09-20 00:15
xlh5225
Rank: 2
等 级:论坛游民
威 望:2
帖 子:188
专家分:25
注 册:2007-8-14
得分:0 

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

2007-09-20 13:49
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
6楼很强,不过还是喜欢读4楼的

Fight  to win  or  die...
2007-09-20 16:02
raohuaren
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-9-19
得分:0 
都是高手 啊,我初学....学习中,谢了哈
2007-09-20 23:03
王振兴
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-10-6
得分:0 

我也写了一个,可能我的还能简单点。。。。自己懒得改了!
#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);
}

2007-10-12 20:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-171321-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.180905 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved