附件 1:
学 号:
课 程 设 计
题 目
马踏棋盘
学 院
计算机科学与技术
专 业
计算机科学与技术
班 级
姓 名
指导教师
2011 年 7 月 4 日
附件 2:
课程设计任务书
专业班级:
班
工作单位: 计算机科学系
学生姓名:
指导教师:
题 目: 马踏棋盘
初始条件:
设计一个国际象棋的马踏遍棋盘的演示程序。
将马随机放在国际象棋的 8×8 棋盘 Board[8][8]的某个方格中,马按走棋
规则(见题集 p98)进行移动。要求每个方格只进入一次,走边棋盘上全部 64
个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字
1,2,3,…,64 依次填入一个 8×8 的方阵,输出之。
测试用例见题集 p98。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明
书撰写等具体要求)
课程设计报告按学校规定格式用 A4 纸打印(书写),并应包含如下内容:
1、 问题描述
简述题目要解决的问题是什么。
2、 设计
存储结构设计、主要算法设计(用类 C 语言或用框图描述)、测试用例
设计;
3、 调试报告
调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、 经验和体会(包括对算法改进的设想)
5、 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数
据,则运行结果要包含这些测试数据和运行输出,
6、 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩
均为 0 分。
时间安排:
1、第 19 周完成。
2、7 月 1 日 14:00 到计算中心检查程序、交课程设计报告、源程序(CD
盘)。
指导教师签名:
年
月 日
系主任(或责任教师)签名:
年
月 日
马踏棋盘
1 问题描述
设计一个国际象棋的马踏遍棋盘的演示程序。
基本要求:
将马随机放在国际象棋的 8×8 棋盘 Board[8][8]的某个方格中,马按走棋
规则(见题集 p98)进行移动。要求每个方格只进入一次,走边棋盘上全部 64
个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字
1,2,3,…,64 依次填入一个 8×8 的方阵,输出之。
2 程序设计
1 存储结构
马位于方格(i,j)时有八个可能的移动位置。分别用两个一维数组 move1[0…7]、
move2[0…7]来表示这八个位置的。Board[][]用于存储走过方格所填入的数字,
从 1 到 64.
int
HTry1[8]={2,2,1,1,-1,-1,-2,-2,},
HTry2[8]={1,-1,2,-2,2,-2,1,-1,},
board[8][8]={{0}};
2 主要算法
程序主要用到两个函数,nextpos 与 movenext。分别用来计算可能的出口
个数和选择出口。
int
{
nextpos(int
i,int
j,int
a[8],int
b[8])
count=0,k,i1,j1;
//函数 nextpos 计算位置(i,j)出口个数
int
for(k=0;k<8;k++)
{
i1=i+move1[k];
j1=j+move2[k];
if(i1>7||i1<0||j1>7||j1<0)
continue;
else
if(board[i1][j1]!=0)
continue;
else
{
a[count]=move1[k];
b[count]=move2[k];
++count;
}
}
return(count);
}
函数 nextpos 用于计算(i,j)可走的出口数,用 count 返回。先从当前位置
走到八个可能的位置中的一个,若超出 8*8 边界则返回进行下一循环,若已被填
入数字则也要返回进行下一循环。反之纪录这一可走出口的位置并将 count 加
1.
int
movenext(int
*i,int
*j,int
a[],int
b[])
{
//函数 movenext 在有多出口时,选择适当出口推进一步
int
temp,count=8,a1[8],b1[8],
nexti_like[8],nextj_like[8],
cur_row_like,cur_col_like,k,t;
for(k=0;k
3 调试程序
运行结果
结果正确
结果错误
无路径
无路径
结果错误
输入无效
预期结果
输入有效
输入无效
输入无效
输入无效
测试数据
(3,4)
(9,0)
(-9,4)
(10,12)
(a,4)
调试结果:
经过测试发现出错,当输入的字符为非数字字符时,均会被默认输入为(0,0)。
原因在于,输入模块用两个整形数据接收用户的输入数据,当这两个数据不是数
字字符时,系统会默认其为 0。故为该模块代码增设两个字符变量以接收用户输
入的数据。在次测试,符合预期结果。当输入数据超过 8 之后就会显示没有路径。
最后调试完了输出一个 8*8 的方阵,方阵中数字从 1 到 64 表示依次所走的每一
步。
4 体会
根据问题描述可知,需要解决的问题并不复杂,整个问题只需要实现一个功
能那就是输出马按特定规则在棋盘上的遍历顺序。但是为了实现该功能却需要好
的算法以减少时间空间复杂度。由于对象是棋盘我们自然想到把棋盘抽象成一个
二维数组,并且用两个一维数组存放(i,j)可能移动到的位子的行与列。主要
用到两个函数 nextpos 和 movepos 分别计算出口个数和选择一个出口走下一步。
每走一步都输出相应数字,从 1 到 64,于每一步相对应。知道走完 8*8 方格。
此程序主要用到回溯的思想,每次选一个出口,如果最后路不通,可以通过前面
保存的位置进行回溯。
其实马踏棋盘问题还可以采用栈或队来作为存储结构,另外非递归算法比递
归算法更简洁,复杂度也小一些。可以采用深度优先搜索来解决。深度优先遍历
马的行走路径所构成的一颗解的空间树,马的行走路径实际上就是从这颗解空间
树的根节点到叶节点过程中经过的所有节点所组成的路径。此外这个程序稍作修
改之后可以表示一个 9*9 的棋盘。
经过这次数据结构课程设计,我们不仅及时巩固了算法及软件工程的知识,
并利用所学的知识解决了实际问题。我的课设题目是马踏棋盘,最初拿到题目很
茫然,但是翻看了一下指导书之后有了个大致思路。大部分代码是自己编写的,
只有其中一个函数是查了资料之后参考了一下的。上机运行程序时没有错误。老
师验收时提了相关问题,我都一一作了回答,对运行结果老师问道 1 到 64 代表
什么,可不可以改成 9*9 方格,对此我都做了回答。我觉得自己对此次实验完成
的还不错,达到了课设的目的。
5 运行结果
输入(3,4)之后运行结果截屏如下:
输入符合要求的初始位置,得到的结果正确。
输入的初始位置不合理,结果显示没有路径。
本科生课程设计成绩评定表
班级:
姓名:
学号:
序号
评分项目
满分
实得分
1 学习态度认真、遵守纪律
2 设计分析合理性
3 设计方案正确性、可行性、创造性
4 设计结果正确性
5 设计报告的规范性
6 设计验收
评语:
10
10
20
40
10
10
总得分/等级
注:最终成绩以五级分制记。优(90-100 分)、良(80-89 分)、中(70-79 分)、
及格(60-69 分)、60 分以下为不及格
指导教师签名:
201 年 月 日