马的Hamilton周游路线问题Word下载.docx
《马的Hamilton周游路线问题Word下载.docx》由会员分享,可在线阅读,更多相关《马的Hamilton周游路线问题Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
在实践中培养独立分析问题和解决问题的作风和能力。
设计环境
1.PC兼容机2.Windows2000/XP操作系统
3.TC集成开发环境或其他C语言开发环境
课程设计要求和任务
要求:
1.熟练掌握递归与分治策略,能够利用递归与分治解决实际问题;
2.使用文件进行存储和管理。
程序启动时可从文件中读取信息,或从键盘输入信息;
运行过程中也可对文件进行存取;
退出前可选择将部分信息保存到文件中;
3.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。
对程序其它部分也进行必要的注释。
4.对系统进行功能模块分析、画出总流程图和各模块流程图;
5.用户界面要求使用方便、简洁明了、美观大方、格式统一。
所有功能可以反复使用,最好使用菜单;
6.通过命令行相应选项能直接进入某个相应菜单选项的功能模块;
7.所有程序需调试通过。
任务:
完成马的Hamilton周游路线问题.设计内容包括:
1.确定能对给定的偶数m,n≥6,且|m-n|≤2,编程计算m╳n的国际象棋棋盘上马的一条Hamilton周游路线;
2.程序能够演示一条Hamilton周游路线的周游过程等。
课程设计工作进度计划
序号
起止日期
工作内容
1
下发任务书,分组,选定课题,查阅相关资料
2
总体设计,划分模块
3
编制源程序
4
上机调试,修改、完善系统
5
程序检查
6
撰写说明书
课程设计报告
课程名称:
软件专题训练
设计题目:
马的Hamilton周游路线问题
院系:
电子信息工程学院
专业:
计算机科学与技术
班级:
学生姓名:
学号:
起止日期:
2011年5月28日~2011年6月3日
指导教师:
第一章需求分析
1.1课程设计题目
8*8的国际象棋棋盘上的一只马,恰好走过除起点外的其他63个位置各一次,最后回到起点。
这条路线称为马的一条Hamilton周游路线。
对于给定的m*n的国际象棋棋盘,m和n均为大于5的偶数,且|m-n|<
=2,式设计一个算法找出马的一条Hamilton周游路线。
1.2课程设计任务及要求
1.3程序运行环境及开发工具
一、程序运行环境
1.PC兼容机
2.Windows2000/XP操作系统
二、开发工具
VisualC++6.0
第二章概要设计
2.1程序流程图
概要流程图
2.2算法设计原理
在n*n的国际象棋棋盘上面的一只马,可按8个不同方向移动。
定义n*n的国际象棋棋盘上的妈的部数图为G=(V,E)。
棋盘上的每个方格对应于图G中的一个顶点,V={(i,j)|0<
=i,j<
n},从一个定点到另一个马步可跳达的顶点之间有一条边E={(u,v),(s,t)|{|u-s|,|v-t|}={1,2}}
第三章详细设计
函数一:
intq(intx,inty)
该函数主要说的的功能是判断马是否可以跳到下一步,如果下一步位置跃出棋盘或是已经走过,返回0值。
函数二:
intw(intx,inty)
该函数主要求的是权值,用来判断马的下一步的下一步可以有几个方向可以跳。
并返回权值的最后数值。
函数三:
voidr(inta[],intb[],intn)
权值排序函数是用来找到权值最小的那一步,找到并以其为马要走的下一步。
函数四:
voidOut()
对结果进行输出。
通过文件函数将运行结果以txt格式输出。
函数五:
voidb(intt,intx,inty)
该函数为本程序的主要函数,其功能是实现马的跳跃,当马有一个位置到另一个位置后通过自身的递归调用,寻找下一个要到达的位置。
当无法进行下一步时通过递归回溯法后退到可执行位置为至。
第四章系统调试
4.1调试结果
第五章课程设计总结与体会
通过将近一个星期的学习和探索,终于按老师的要求完成了各项任务,本次课程设计是我跟进一步了解了算法设计的重要性学好算法设计对今后的课程学习有着很大的帮助,但是在整个课程设计阶段,自己还有很多不足的地方,一旦遇到很难解决的问题,陷入困境后,很难自己独立的解决问题,常常需要老师的引导。
在今后的学习工作过程中还要加强独立解决问题的能力。
作为开放式设计型的实验,不仅仅可以激发学生独立思考和创新的意识,让学生感受、理解知识产生和发展的过程,培养学生的科学精神和创新思维习惯,重视培养学生收集信息的能力,获取新知识的能力,更可以提高学生实际动手能力。
附录马的Hamilton周游路线问题程序
#include<
stdio.h>
stdlib.h>
constintM=6;
constintN=6;
intchess[M][N]={0};
inta[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
chars[20];
{
if(x>
=0&
&
x<
M&
y>
y<
N&
chess[x][y]==0)
return1;
return0;
}
//求权值
intc=0;
for(inti=0;
i<
8;
++i)
{
if(q(x+a[i][0],y+a[i][1]))
c++;
}
returnc;
//权值排序
if(n<
=0)return;
n;
for(intj=i;
j>
0;
--j)
if(a[j]<
a[j-1])
inttemp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
temp=b[j-1];
b[j-1]=b[j];
b[j]=temp;
//输出结果
FILE*fp;
if((fp=fopen(s,"
w"
))==NULL)
{}
inti,j,k,l=0;
fprintf(fp,"
\n坐标表示结果:
\n"
);
for(i=1;
i<
=M*N;
i++)
for(j=0;
j<
M;
j++)
{
for(k=0;
k<
N;
k++)
{
if(chess[j][k]==i)
{
fprintf(fp,"
(%d,%d)"
j,k);
}
}
}
l++;
if(l%6==0)
fprintf(fp,"
fclose(fp);
if(t>
=M*N)
Out();
exit
(1);
//求得一个解时,退出程序
else
inti;
intcount[8],s[8];
intk=0;
for(i=0;
count[k]=w(x+a[i][0],y+a[i][1]);
//求权值
s[k++]=i;
//保存下一个结点的序号
r(count,s,k);
//排序
k;
intd=s[i];
x+=a[d][0];
y+=a[d][1];
chess[x][y]=t+1;
printf("
%d"
chess[x][y]);
b(t+1,x,y);
//递归调用回溯
chess[x][y]=0;
x-=a[d][0];
y-=a[d][1];
intmain()
intx=0;
inty=0;
chess[x][y]=1;
sprintf(s,"
result.txt"
b(1,x,y);
专业班级
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
分值
评分要素
成绩
1设计过程中出勤、学习态度等方面
20
上机出勤及端正的学习态度、认真刻苦程度等
2软件设计质量
40
采用的算法、设计方案,设计结果,界面友好等方面进行综合评定
3答辩
能简明扼要地阐述设计的主要内容,能准确流利地回答各种问题
4设计报告书写
10
条理清晰,表述清楚、措词得当
5实际动手能力
组长全面负责,承担复杂的模块设计分值就高
总成绩
计算机系课程设计指导教师评分表