马踏棋盘.docx
- 文档编号:10791186
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:13
- 大小:83.43KB
马踏棋盘.docx
《马踏棋盘.docx》由会员分享,可在线阅读,更多相关《马踏棋盘.docx(13页珍藏版)》请在冰豆网上搜索。
马踏棋盘
毕业设计,课程设计有困难?
加QQ929486211
一、设计要求
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读;
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好);
(3)学生可自动增加新功能模块(视情况可另外加分);
(4)写出课程设计报告,具体要求见相关说明文档。
1、问题描述:
将马随机放在国际象棋的8*8棋盘的某个方格中,马按走棋规则进行移动。
要求每个方格上只进入一次,走遍棋盘上全部64个方格。
编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入这个8*8的方阵,输出之。
请用C/C++编写一系统,模拟运动会分数统计过程,软件应包括如下几个方面:
2、设计要求
(1)程序的输入:
设计程序按要求输入马的初始位置。
(2)程序的输出:
程序的设计完成后应给出马从初始位置走遍棋盘的过程,并按照求出的行走路线的顺序,将1,2,3,4,…64依次填入8*8棋盘方阵,并输出之。
3、数据结构与实现提示
每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。
二、概要设计
1、主界面设计
课程设计报告。
2、系统功能设计
图1系统功能结构图
三、模块设计
1.系统子程序及功能设计
(1)判断空栈
boolempty_stack(sqstack&s)//判断栈是否为空
{if(s.top==s.base)
return0;
else
return1;}
(2)入栈和出栈
voidpush(sqstack&s,huaqipan&q)//插入元素为新的栈顶元素
{*s.top=q;s.top++;}
voidpop(sqstack&s,huaqipan&q)//删除栈顶元素,q返回其值
{s.top--;q=*s.top;}
(3)计算可走的路线
{intcount(intr,intc)//count函数用以计算并返回下一步某方向可行路线的总数
{
intdi_n=0,k,e,f;
for(k=0;k<8;k++)
{
e=r+dir[k][0];//改变横坐标
f=c+dir[k][1];//改变纵坐标
if(e>-1&&e sign[e][f]) {di_n++;} } returndi_n;//返回下一步某方向可行路线的总数 } 四、详细设计 1、数据类型定义 (1)定义一个结构体,用来画一个8*8的棋盘格 typedefstructhuaqipan{ intnum;//记录该格是路径中的第几步 intheng;//该格的横坐标 intzong;//该格的纵坐标 intdi[8];//记录该格的下一步(8个方向)是否走过,走过为1否则为0 }huaqipan; huaqipanq,p; (2)定义一个栈的结构体 其实现代码如下: typedefstructsqstack{//定义栈 huaqipan*base;//栈底指针 huaqipan*top;//栈顶指针 intstacksize;//栈容量 }sqstack; sqstacks,sp; 2.主函数 voidmain()是主函数。 列出主菜单,利用switch语句调用以上函数实现各个菜单的功能。 其实现代码如下: intmain() { system("color9E"); intchoice,s; cout<<"请选择,1开始,2退出"< cin>>choice; switch(choice) { case1: do { chess(); cout<<"请选择1---->继续输入,0---->跳出"< cin>>s; }while(s==1); case2: break; } return0; } 五、测试分析 运行程序,进入系统主菜单。 用户可以选择开始或退出系统,界面如图所示。 (输入1,1的结果) 用户可以按1再次输入,也可按0推出系统。 (4)退出系统 在主菜单下输入0可以退出系统,并有中文提示,如图所示。 退出系统 六、用户使用手册 1.输入信息,横坐标和纵坐标(依照提示,确保输入的信息在规定的范围之内) 0.退出系统。 七.源代码 其实现代码如下: #include #include #include #include intqipan[8][8];//棋盘方阵,存放各点走的次序 intr,c,i,j,total,n=8,max=64;//r,c分别表示横纵坐标;total进入路径栈的元素个数;n是棋盘行列数;max是总格数 intdir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};//定义8个方向的操作 intsign[8][8];//标记该格是否已走过,是为1,否为0 typedefstructhuaqipan{ intnum;//记录该格是路径中的第几步 intheng;//该格的横坐标 intzong;//该格的纵坐标 intdi[8];//记录该格的下一步(8个方向)是否走过,走过为1否则为0 }huaqipan; huaqipanq,p; typedefstructsqstack{//定义栈 huaqipan*base;//栈底指针 huaqipan*top;//栈顶指针 intstacksize;//栈容量 }sqstack; sqstacks,sp; intmake_stack(sqstack&s)//构造一个空栈s { s.base=newhuaqipan[max];//分配栈的内存空间 s.top=s.base;//空栈,栈底、栈顶指针指向一处 s.stacksize=max;//栈的最大容量等于max=64 return1; } boolempty_stack(sqstack&s)//判断栈是否为空 { if(s.top==s.base) return0; else return1; } voidpush(sqstack&s,huaqipan&q)//插入元素为新的栈顶元素 {*s.top=q;s.top++;} voidpop(sqstack&s,huaqipan&q)//删除栈顶元素,q返回其值 {s.top--;q=*s.top;} intcount(intr,intc)//count函数用以计算并返回下一步某方向可行路线的总数 { intdi_n=0,k,e,f; for(k=0;k<8;k++) { e=r+dir[k][0];//改变横坐标 f=c+dir[k][1];//改变纵坐标 if(e>-1&&e sign[e][f]) {di_n++;} } returndi_n;//返回下一步某方向可行路线的总数 } voidchess()//过程函数 { intnextr,nextc,min,nr,nc;//nextr和nextc分别记录选中的最少可通方向的下一格横纵坐标 total=0;//入栈数个数初值为0 if(make_stack(s))//空栈构造成功,输入起始坐标 { cout<<"(*^__^*)……欢迎使用"< cout<<"输入马的起始位置(注意按空格隔开): "; cin>>r; cin>>c; if(r<0||r>8||c<0||c>8)//判断是否越界 { cout<<"过界请重新输入"< cin>>r; cin>>c; } } while(total { if(r>-1&&r<8&&c>-1&&c<8&&! sign[r][c])//未过界且未曾走过的点,压入栈 { q.heng=r;//存储行坐标 q.zong=c;//存储列坐标 push(s,q);//当前点压入栈 sign[r][c]=1;//标记为已走过 total++;//入栈数加一 nextr=r; nextc=c; min=8; } for(i=0;i<8;i++)//寻找拥有最少可通方向的下一格 { nr=r+dir[i][0];nc=c+dir[i][1]; if(nr>-1&&nr sign[nr][nc])//若该点的下一步可继续往下走,则改变行列数 { if(count(nr,nc) { nextr=nr;nextc=nc;min=count(nr,nc); } } } if(total==max)break;//入栈数满总格数,跳出循环 if(nextr! =r) { r=nextr; c=nextc; } /*else//没地方走,悔棋(回溯)到上一步 { pop(s,q); sign[r][c]=0; total--; pop(s,q); r=q.heng; c=q.zong; push(s,q); }*/ if(! empty_stack(s))//栈为空 { cout<<"没有通路"< break; } } while(empty_stack(s))//栈不为空 { s.top--; q=*s.top; r=q.heng; c=q.zong; qipan[r][c]=max--;//准备输出棋盘格结构体,一个一个出栈,qipan[r][c]数组记录其路径序号 } cout< cout<<"︻︻︻︻︻︻︻︻︻︻毕业设计,课程设计有困难? 加QQ929486211︻︻︻︻︻︻︻︻︻︻"< cout<<"━━━━━━━━━━━━━━━━━━━━━━━"< for(i=0;i { for(j=0;j { cout< } cout< cout<<"━━━━━━━━━━━━━━━━━━━━━━━"; cout< } cout< cout<<"︼︼︼︼︼︼︼︼︼︼程序结束︼︼︼︼︼︼︼︼︼︼"; cout< //system("pause"); //︹︻︼︱┿╈━─┈┉│┃┊│┆︳| } intmain() { system("color9E"); intchoice,s; cout<<"请选择,1开始,2退出"< cin>>choice; switch(choice) { case1: do { chess(); cout<<"请选择1---->继续输入,0---->跳出"< cin>>s; }while(s==1); case2: break; } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 棋盘