一、题目
奇数阶幻方求解
【问题描述】
幻方是一种很有意思的数字矩阵,在很早著名的九宫八卦阵就与幻方有关。幻方的定义为: 1 到 N*N 的整数填入N*N的方格 中,每行和每列以及对角线的数字之和必须是相等的。
你作为八卦公司的顶级程序员,现在需要你解决一个问题,将任意奇数阶的幻方找出来。
【基本要求】
输入包括多个测试集,每行为一个正奇数N(1 <= N < 1000),0作为输入的结束且不需要处理 ,对于输入的每一个N, 输出一个它所对应的N阶幻方,如果存在多个,任意一个即可,每个幻方为N*N的矩阵,对于每个幻方,每行输出幻方的一行,每行中的数字之间用一个或多个空格分开。不同的幻方之间用一个空行分开。
二、问题分析及任务定义
【问题分析】
1、本程序要求输出奇数N阶幻方,其重点应该就是在求幻方的算法上,我们
可以通过二维数组的方法来定义存储幻方。
2、本程序要输入多个测试集,可通过一位数组来存储,可通过查找算法在测试集中找出是否有你要的幻方。
【任务定义】
通过对初始化的二维数组值的重新编排,用几个判断语句来实现幻方的输出。
三、数据结构的选择和概要设计
1、采用一个子函数实现测试集的输入,并存储在数组中,同时定义一个数组指针,存储完成后返回指向该数组的指针。
2、采用另外一个子函数判断你要找的幻方是否在测试集中,形参为1中指向数组的指针和来自主函数中你要查找的幻方的阶数。如果查找成功返回1,否则返回0;
3、基本操作:int Input()
操作结果:实现测试集的输入,并返回
int Search(int *p,int m)
操作结果:确定你要查找的幻方是否在测试集中,如果在返回1,否则 返回0;
Void main()
操作结果:主函数,实现你要幻方的阶数的输入,同时实现幻方初始化后 数据的重新编排,使之成为幻方并输出。
4、核心程序的算法
奇数阶幻方的构造方法很简单,我们先来看一个三阶幻方。
各数在方阵中的位置可以这样确定:
首先把1放在最上一行正中间的方格中,然后把下一个整数放置到右上方,如果到达最上一行,下一个整数放在最后一行,就好像它在第一行的上面,如果到达最右端,则下一整数放在最左端,就好像它在最右一列的右侧,当到达的方格中已填上数值时,下一个整数就放在刚填上数码的方格的正下方。照着三阶幻方,从1至9走一下,就可以明白它的构造方法。
四、详细设计和编码
1、主函数:
Void main()
{int m,mm,i,j,ni,nj,s,*h;
Int magic[Max][Max];
先输入你要查找幻方的阶数
然后调用Input()
最后调用Search()
输出。
}
2、Input函数:int Input()
{
Int i[Max],*p=NULL,j=0;
返回指针p
}
3、Search()函数:int Search(int *p,int m)
{
通过判断*p是否为0来结束查找,因为输入时是以0结束的。
返回0或1.
}
4、幻方的求解 :先用if判断你你输入的阶数是否为奇数,如果是,继续判断Search的返回值是否为1,如果是,则开始重新编排数组的值。首先,将1放在第一行的正中间的空格中,然后把2放在1空格的右上方,像田字的对角一样,如果1刚好是最后一列,则2放在第一列,1的上一行;如果1刚好在第一行,则2放在最后一行。如果1的右上方位置已经有数,则把2放在该数的正下方一行。其他数同理。
5、具体代码:
#include<stdio.h>
#define Max 100
int Input()
{int i[Max],*p=NULL,j=0;
p=i;
printf("输入多个测试集,以0结束……\n");
i[j]=-1;
while(i[j]!=0)
{ j++;
scanf("%d",&i[j]);//从一开始存储
}
return p;
}
int Search(int *p,int m)
{
while(*p!=0)
{
if(*p==m)
return 1;
p++;
}
return 0;
}
void main(void)
{
int m,mm,i,j,k,ni,nj,s,*h;
int magic[Max][Max];
h=Input();
printf("请输入你要查找的幻方的阶数:");
scanf("%d",&m);
for(i=0;i<m;i++)//初始化该矩阵
for(j=0;j<m;j++)
magic[i][j]=0;
if((m>0)&&(m%2!=0))
{ s=Search(h,m);
if(s==1)
{ mm=m*m;//表示数据的个数
i=0;j=m/2;//第一个值得位置
for(k=1;k<=mm;k++)
{
magic[i][j]=k;//将每一个值放入空格
//求右方格的坐标
if(i==0)//最上一行
ni=m-1;//下一个位置在最下一行
else
ni=i-1;//否则下一个位置向上移动一位
if(j==m-1)//最右端
nj=0;//下一个位置在最左端
else
nj=j+1;//否则下一列
if(magic[ni][nj]==0)//右上方无值
{ i=ni;
j=nj;
}
else//右上方方格已经填上了数
i++;
}
printf("查找成功!\n幻方如下\n");
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
printf("%4d",magic[i][j]);
printf("\n");
}
}
else
printf("在测试集中没有找到你要的幻方!!!\n");
}
else//偶数和非正数情况
printf("输入错误,该程序只能查抄奇数阶幻方!!\n!");
}
五、测试结果及分析
分析:先是输入一连串的测试集,并以0结束,然后输入你要查找的幻方的阶数,11阶,因为11在测试集中,所以表示查找成功,并且输出11阶幻方,可以检测到该幻方符合要求。
分析:15不在测试集中,由主程序中的Search()函数的返回值可以判断,15不等于数组i【】中的任一个值,所以返回0给主函数,故提示在测试集中没有找到你要找的幻方,并且无法输出幻方。
六、用书使用说明
1、本程序运行的环境为window操作系统。
2、运行的工具为vc++6.0。
3、在Dos的页面下,请按要求输入。
七、参考文献
【1】王昆仑 李红《数据结构与算法》。北京.中国铁道出版社.2007.6
【2】谭浩强 《c程序设计》。北京.清华大学出版社.2010.6
【3】严蔚敏 吴伟明 《数据结构》 北京.清华大学出版社2002.9
八、附录
源程序文件清单:
#include<stdio.h>
#define Max 100
int Input()
{int i[Max],*p=NULL,j=0;
p=i;
printf("输入多个测试集,以0结束……\n");
i[j]=-1;
while(i[j]!=0)
{ j++;
scanf("%d",&i[j]);//从一开始存储
}
return p;
}
int Search(int *p,int m)
{
while(*p!=0)
{
if(*p==m)
return 1;
p++;
}
return 0;
}
void main(void)
{
int m,mm,i,j,k,ni,nj,s,*h;
int magic[Max][Max];
h=Input();
printf("请输入你要查找的幻方的阶数:");
scanf("%d",&m);
for(i=0;i<m;i++)//初始化该矩阵
for(j=0;j<m;j++)
magic[i][j]=0;
if((m>0)&&(m%2!=0))
{ s=Search(h,m);
if(s==1)
{ mm=m*m;//表示数据的个数
i=0;j=m/2;//第一个值得位置
for(k=1;k<=mm;k++)
{
magic[i][j]=k;//将每一个值放入空格
//求右方格的坐标
if(i==0)//最上一行
ni=m-1;//下一个位置在最下一行
else
ni=i-1;//否则下一个位置向上移动一位
if(j==m-1)//最右端
nj=0;//下一个位置在最左端
else
nj=j+1;//否则下一列
if(magic[ni][nj]==0)//右上方无值
{
i=ni;
j=nj;
}
else//右上方方格已经填上了数
i++;
}
printf("查找成功!\n幻方如下\n");
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
printf("%4d",magic[i][j]);
printf("\n");
}
}
else
printf("在测试集中没有找到你要的幻方!!!\n");
}
else//偶数和非正数情况
printf("输入错误,该程序只能查抄奇数阶幻方!!\n!");
}
华 北 科 技 学 院
课程设计说明书
(数据结构课程设计)
班级: 信管B08-1 姓名: 陈秋苗
学号: 200807034118
设计题目: 敢死队问题
设计时间:__20##-9-6_____至___20##-9-17____
指导教师:______兰 芸__________________
评 语:________________________________
_________________________________________
_________________________________________
_________________________________________
_________________________________________
评阅成绩:__ __评阅教师:__ ___
《数据结构》课程设计实验报告
开课实验室:基础实验室一 20## 年9 月16 日
课程设计说明书课程名称:数据结构与算法专业:计算机科学与技术班级:103013姓名:XXX学号:03指导教师:XXX完成日期:20…
西安郵電學院数据结构课程设计报告题目校园导航系统院系名称计算机学院专业名称计算机科学与技术班级学生姓名学号8位指导教师设计起止时间…
安徽省巢湖学院计算机与信息工程学院课程设计报告课程名称课题名称用三元组实现稀疏矩阵的转置相加相乘专业计算机科学与技术班级学号AA姓…
扬州大学信息工程学院数据结构课程设计报告题目井字棋小游戏班级学号姓名指导教师一课程题目井字棋小游戏二需求分析计算机和人对弈问题计算…
攀枝花学院学生课程设计论文题目学生姓名学号20xx108010所在院系数学与计算机学院专业计算机科学与技术专业班级20xx级计算机…
CENTRALSOUTHUNIVERSITY数据结构课程设计报告题目学生姓名指导教师学院专业班级完成时间交通旅游图的最短路径问题摘…
课程设计说明书课程名:《数据结构课程设计》题目:一元多项式运算系统20##年1月一、课程认识数据结构课程主要是研究非数值计算的程序…
西安郵電學院数据结构课程设计报告题目校园导航系统院系名称计算机学院专业名称计算机科学与技术班级学生姓名学号8位指导教师设计起止时间…
攀枝花学院学生课程设计论文题目学生姓名学号20xx108010所在院系数学与计算机学院专业计算机科学与技术专业班级20xx级计算机…
数据结构课程设计报告学生姓名学号班级地信10901长江大学20XX.6目录1.需求分析......................…
合肥学院计算机科学与技术系课程设计报告20xx20xx学年第二学期课程数据结构与算法设计顺序表结构的相关函数库课程设计名称学学专指…