社区
C语言
帖子详情
魔方阵问题,诚望指教
herry168
2005-07-26 06:10:33
本人正在学习谭浩强先生的(C语言程序设计[第二版]),在第七章习题中有下面这道题, 感觉无从下手。诚望指点。
7.7 打印 “魔方阵 ”。
所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求打印出其1到n平方的自然数构成的魔方阵。
...全文
346
8
打赏
收藏
魔方阵问题,诚望指教
本人正在学习谭浩强先生的(C语言程序设计[第二版]),在第七章习题中有下面这道题, 感觉无从下手。诚望指点。 7.7 打印 “魔方阵 ”。 所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。 例如,三阶魔方阵为 8 1 6 3 5 7 4 9 2 要求打印出其1到n平方的自然数构成的魔方阵。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
herry168
2005-07-27
打赏
举报
回复
感谢大家
我结合 whq263(玄豹)和jixingzhong(瞌睡虫) 做了只有奇数的。偶数的做不出来。
#include <stdio.h>
#define MAX 30
void main()
{
int magic[MAX][MAX];
int i, j, row, col;
int count, size;
printf("Please input a size: ");
scanf("%d", &size);
if( size<1 || size>MAX )
{
printf("The size is overload!\n");
}
else if( size%2 ==0 )
{
printf("Input size is enve!\n");
}
else
{
for( i=0; i<size; i++ )
for( j=0; j<size; j++ )
magic[i][j] = 0;
magic[0][size/2] = 1;
i = 0;
j = size/2;
for( count=2; count<=size*size; count++ )
{
if(i==0)
i=size-1;
else
i=i-1;
if(j==0)
j=size-1;
else
j=j-1;
if(magic[i][j])
{
magic[row+1][col] = count;
i=row+1;
j=col;
}
else
{
magic[i][j] = count;
}
row=i;
col=j;
}
}
printf("The magic square is:\n");
for( i=0; i<size; i++ )
for( j=0; j<size; j++ )
{
printf("%5d", magic[i][j]);
if( j==size-1 )
printf("\n\n");
}
}
jixingzhong
2005-07-26
打赏
举报
回复
我以前看到的一个帖子
不过不是很全面
只有奇数魔方....
jixingzhong
2005-07-26
打赏
举报
回复
奇数阶的魔方有个固定的方法
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放: 每一个数存放的行比前一个数的行数减1,列数加1
(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如1在第1行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如2在第3行最后一列,则3应放在第2行第1列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
例如按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。按此方法可以得到任何阶的魔方阵。
void FillOddMagicMatrix( int *addr, int n )
{
assert( n >= 3 && n % 2 ); // 检查是否有效的奇数阶
// 初始置零
memset( addr, 0, n * n * sizeof(int) );
// 第一行中间位置填 1
int i = 0, j = n / 2;
addr[ i * n + j ] = 1;
// 按向右上的斜线填充
for( int k=2; k<=n*n; ++k )
{
i = (i + n - 1) % n; // 循环上移一行
j = (j + 1) % n; // 循环右移一列
if( addr[ i * n + j ] != 0 ) // 该位置已有数值,到上一数的下一行
{
i = (i + 2) % n; // 下移二行
j = (j + n -1 ) % n; // 左移一列
}
addr[ i * n + j ] = k;
}
}
jixingzhong
2005-07-26
打赏
举报
回复
有一个古老的魔方阵赋值算法的
就是按照一定的顺序给方阵赋值
看看参考一下...
dirtysalt
2005-07-26
打赏
举报
回复
http://community.csdn.net/Expert/topic/3986/3986970.xml?temp=3.390139E-02
wenbinzndx
2005-07-26
打赏
举报
回复
不好做啊,n没有给出具体的值?等高手!
玄豹
2005-07-26
打赏
举报
回复
#include <stdio.h>
#define MAX 15
void main()
{
int magic[MAX][MAX];
int i, j, row, col;
int count, size;
printf("Please input a size: ");
scanf("%d", &size);
if( size<1 || size>MAX )
{
printf("The size is overload!\n");
}
else if( size%2 ==0 )
{
printf("Input size is enve!\n");
}
else
{
for( i=0; i<size; i++ )
for( j=0; j<size; j++ )
magic[i][j] = 0;
magic[0][size/2] = 1;
i = 0;
j = size/2;
for( count=2; count<=size*size; count++ )
{
row = (i-1<0)?(size-1):(i-1);
col = (j-1<0)?(size-1):(j-1);
if( magic[row][col] )
{
i = (++i)%size;
}
else
{
i = row;
j = (j-1<0)?(size-1):(--j);
}
magic[i][j] = count;
}
}
printf("The magic square is:\n");
for( i=0; i<size; i++ )
for( j=0; j<size; j++ )
{
printf("%3d", magic[i][j];
if( j==size )
printf("\n");
}
}
LoveYouJustOneDay
2005-07-26
打赏
举报
回复
奇数 -- 萝卜法
偶数 -- 由奇数构造
仿QQ概念版登陆界面,酷狗魔方,C# winForm .Net 2.0 源码
酷狗魔方:4个角有淡入淡出效果。 还有其他几个特效例子。 此项目中包含了多个界面设计例子。VS2013。 界面库不开源,如果你需要源码你可以联系我。本项目只用于学习参考,请勿用于非法或商务用途,谢谢合作!
java源码包---java 源码 大量 实例
内容索引:JAVA源码,游戏娱乐,魔方,网页游戏 Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性...
魔方阵
问题
的求解
魔方阵
问题
的分析与求解(以5阶为列) 一、定义
魔方阵
,古代又称“纵横图”,是指组成元素为自然数1、2、…、n2的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。...
C语言之
魔方阵
C语言之
魔方阵
魔方阵
定义
魔方阵
分类
魔方阵
规律
魔方阵
算法
魔方阵
定义 所谓
魔方阵
就是指一种nxn的方阵,它的每一行、每一列和对角线之和均相等。 举例: 8 1 6 3 5 7 4 9 2
魔方阵
分类
魔方阵
可以分为三类: 奇
魔方阵
...
C++
魔方阵
的生成
何为
魔方阵
在n*n的矩阵中填入1到n^2的数字(n为奇数),使得每一...
魔方阵
的实现解决
魔方阵
问题
的方法很多,本文采用如下规则产生
魔方阵
: 1. 由1开始填数,将1放在第0行的中间位置。 2. 将魔方想想成上下左右相接,
C语言
70,035
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章