




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2.4题马踏棋盘题目:设计一个国际象棋的马踏棋盘的演示程序班级:。姓名:。学号:完毕口期:—.需求分析(1)输入的形式和输入值的范围:输入马的初始行坐标X和列坐标Y,X和Y的范围都是[1,8]。(2)输出形式:以数组下表的形式输入,i为行标,j为列标,用空格符号隔开。以棋盘形式输出,每一格打印马走的步数,这种方式比较直观(3)程序所能达成的功能:让马从任意起点出发都可以遍历整个8*8的棋盘。(4)测试数据,涉及对的输入及输出结果和具有错误的输入及其输出结果。数据可以任定,只要l<=x,y<=8就可以了。对的的输出结果为一个二维数组,每个元素的值表达马行走的第几步,若输入有错,则程序会显示:“输入有误!请重新输入……”并且规定用户重新输入数据,直至输入对的为止。二.概要设计(1)、位置的存储表达方式(2)typedefstruct{
P:俄的文若\C-Free\Temp除命名3.exe"■aPleaseinputInputx■2Inputy=3beginwith11inpoi»tpoint<l<=x<=8andboard:l<=y<=8>i▲23141924291417520130151825283235623582716132163346554059263453225744471239764455437604148523562950433811638513661104942请按任意键继续...,xl五.原程序代码#inc1ude<stdio.h>#defineMAXSIZE100#defineN8intboard[8][8];〃定义棋盘intHtryl[8]={1,-1,—2,2,2,1,・1,-2};/*存储马各个出口位置相对当前位置行下标的*/intHtry2[8]={2,-2,1,1,-1,-2,2,-l};/*存储马各个出口位置相对当前位置列下标的增量数组*/structStack{〃定义栈类型inti;inti;inti;//行坐标intj;inti;//行坐标intdirector;//存储方向}stack[MAXSIZE];〃定义一个栈数组inttop=-l;//栈指针voidInitLocation(intxijntyi);〃马儿在棋盘上的起始位置坐标intTryPathfintiJntj);〃马儿每个方向进行尝试,直到试完整个棋盘voidDisplay();//输出马儿行走的途径voidInitLocation(intxi,intyi)(intx,y;〃定义棋盘的横纵坐标变量top++;〃栈指针指向第一个栈首stack[top],i=xi;//将起始位置的横坐标进栈stack[top].j=yi;//将起始位置的纵坐标进栈stack[top].director=-l;//将起始位置的尝试方向赋初值board[xi][yi]=top+l;〃标记棋盘x=stack[top],i;//将起始位置的横坐标赋给棋盘的横坐标y=stack[top].j;〃将起始位置的纵坐标赋给棋盘的纵坐标if(TryPath(x,y))//调用马儿探寻函数,假如马儿探寻整个棋盘返回1否则返回0Disp1ay();//输出马儿的行走途径elseprintf("无解”);)intTryPath(inti,intj){intfind,director,number,min;//定义几个临时变量int//定义几个临时变量inta[8],bl[8],b2[8],d[8];//定义几个临时数组whiIe(top>—1)//栈不空时循环{for(h=0;h<8;h++)〃用数组a[8]记录当前位置的下一个位置的可行途径的条数(number=0;i=stack[top].i+Htryl[h];j=stack[top].j+Htry2[h];b2[h]=j;if(board[i][j]==0&&i>=0&&i<8&&j>=0&&j<8)〃假如找到下一位置(for(k=0;k<8;k++)(。i1=b1[h]+Htry1[k];jl=b2[h]+Htry2[k];if(board[il][jl]==0&&il>=0&&il<8&&jl>=0&&jl<8)〃假如找到下一位置number++;〃记录条数)a[h]=number;〃将条数存入数组a[8]中)}for(h=0;h<8;h++)〃根据可行途径条数小到大按下表排序放入数组d[8]中{min=9;for(k=0;kV8;k++)If(min>a[k])min=a[k];d[h]=k;//将下表存入数组d[8]中s=k;)a[s]=9;)director=stack[top],director;if(top>=63)〃假如走完整个棋盘返回1return(1);find=0;〃表达没有找到下一个位置for(h=director+l;h<8;h++)〃向八个方向进行探寻(i=stack[top].i+Htry1[d[h]];j=stack[top].j+Htry2[d[h]];if(board[i][j]==0&&i>=0&&i<8&&j>=0&&jV8)〃假如找到下一位置find=l;〃表达找到下一个位置))if(find==l)〃假如找到下一个位置进栈(stack[top].director=director;〃存储栈结点的方向top++;//栈指针前移进栈stack[top].i=i;stack[top].j=j;。stack[top].director=-l;//重新初始化下一,栈结点的尝试方向board[i][j]=top+1;〃标记棋盘)e1se//否则退栈(。board[stack[top].i][stack[top].j]=0;〃清除棋盘的标记。top-;//栈指针前移退栈)return(0);voidDisplay()inti,j;for(i=0;i<N;i++){for(j=0;j<N;j++)printf("\t%d'\boardti][j]);〃输出马儿在棋盘上走过的途径oprintf("\n\n");)printf("\n");)intmain()(inti,j;intx,y;。for(i=0;i<N;i++)//初始化棋盘for(j=0;j<N;j++)。printf("Pleaseinputimportpoint(l<=x<=8andl<=y<=8)\n");printf("Inputx=");scanf("%d",&x);//输入起始位置的横坐标printf("Inputy=");scanf("%d",&y);〃输入起始位置的纵坐标if(x>=l&&x<=8&&y>=l&&y<=8)break;printf("Yourinputisworng!!!\n"):printf("beginwith%dboard:\n\n",8*(x-l)+y);InitLocation(x-l,y—1);〃调用起始坐标函数inty;intfrom;}Point;(2)、栈的存储方式#defineSTACKSIZE70#defineSTACKINCREASE10typedefstructStack{Point*top;Point*base;intstacksize;};(1)、设定栈的抽象数据类型定义:ADTStack-数据对象:D={ai|aiWEIemSet,i=l,2””n,n20}数据关系:R1={<ai-l,ai>|ai-l,aiED,i=2,,,,n}约定an端为栈顶,ai端为栈顶。基本操作:旨InitStack(&s)操作结果:构造一个空栈s,DestroyStack(&s)初始条件:栈s己存在。操作结果:栈S被销毁。ClearStack(&s)初始条件:栈s已存在。操作结果:栈s清为空栈。StackEmpty(&s)初始条件:栈s已存在。操作结果:若栈s为空栈,则返回TRUE,否则返回FALSE。StackLength(s);初始条件:栈s存在。操作结果:返回s的元素个数,即栈的长度。GetTop(s,&e);初始条件:栈s己存在且非空。操作结果:用e返回s的栈顶元素。Push(&s,e)初始条件:栈s已存在。操作结果:插入元素e为新的栈顶元素。Pop(&s,&e)初始条件:栈s存在且非空。
操作结果:删除栈顶元素,并用e返回。stackTraverse(s,visit())初始条件:栈s存在且非空。操作结果:从栈底到栈顶依次对s的每个元素调用Visit()o一旦Visit()失败,则操作失败。}ADTStack本程序包含模块:1、主程序模块:voidmain(){定义变量;接受命令;解决命令;退出;}2、起始坐标函数模块一一马儿在棋盘上的起始位置;3、探寻途径函数模块一一马儿每个方向进行尝试,直到试完整个棋盘;4、输出途径函数模块一一输出马儿行走的途径;三.具体设计1.函数声明VoidInitLocation(intxi,intyi);//马儿在棋盘上的起始位置标intTryPath(inti,intj);//马儿每个方向进行尝试,直到试完整个棋盘voidDisplayf);//输出马儿行走的途径2.起始坐标函数模块voidInitLocation(intxijntyi){intx.y;〃定义棋盘的横纵坐标变量top++top++;top++;//栈指针指向第一个栈首stack[top].i=xi;top++;//栈指针指向第一个栈首stack[top].j=yi;〃将起始位置的纵坐标进栈stack[top].director=-1;//将起始位置的尝试方向赋初值board[xi][yi]=top+1;〃标记棋盘x=stack[top].i;//将起始位置的横坐标赋给棋盘的横标y=stack[top].j;〃将起始位置的纵坐标赋给棋盘的纵坐标iffTryPathtx,y))〃调用马儿探寻函数,假如马儿探寻整个棋盘返回1否则0Display();//输出马儿的行走途径elseprint「(”无解");)3.探寻途径函数模块intTryPath(intijntj){intfind,director,number,min;//定义几个临时变量inti1,jl,h,k,s;〃定义几个临时变量inta[8Lbl[8Lb2[8Ld[8];//定义几个临时数组whi1e(top>-1)〃栈不空时循环(for(h=0;h<8;h++)//用数组a[8]记录当前位置的下一个位置的可行途径的条数
number=O;i=stack[top].i+Htryl[h];j=stack[top].j4-Htry2[h];bl[h]=i;b2[h]=j;if(board[i][j]==0&&i>=0&&i<8&&j>=0&&j<8)〃假如找到下一位置{for(k=0;k<8;k++)(il=bl[h]+Htryl[k];jl=b2[h]+Htry2[k];if(board[il][jl]==0&&i1>=0&&il<8&&j1>=0&&jl<8)0。。。3。//假如找到下一位置number++;number++;number++;〃记录条数a[h]=number;number++;〃记录条数a[h]=number;a[h]=number;〃将条数存入数组a[h]=number;〃将条数存入数组a[8]中for(h=0;h<8;h++)//根据可行途径条数小到大按下表排序放d[8]中{min=9;for(k=0;k<8;k++)if(min>a[k]){min=a[k];od[h]=k;//将下表存入数组d[8]中s=k;}a[s]=9;)director=stack[top],director;if(top>=63)〃假如走完整个棋盘返回1return(1);find=0;〃表达没有找到下一个位置for(h=director+l;h<8;h++)〃向八个方向进行探寻{i=stack[top].i+Htryl[d[h]];j=stack
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产品开发进度跟踪表-新产品开发流程
- 薪资详情与奖金补助证明书(6篇)
- 移民招聘考试试题及答案
- 医院中级考试试题及答案
- 六一创意集体活动方案
- 六一夹珠子活动方案
- 医学考试试题及答案详解
- 六一扶贫活动方案
- 六一校园集体活动方案
- 六一活动小食品活动方案
- 通信员工安全试题及答案
- 2025年洗纹身协议书
- 工会厂务公开课件
- 桃花源记的试题及答案
- 工厂计件奖罚管理制度
- GA/T 2014-2023道路交通信号配时运行管理规范
- 【9语二模】北京市东城区2025年6月份中考二模语文试卷
- 2025年湖南省普通高中学业水平合格性考试仿真(三)数学试卷(含答案)
- 2025黑龙江省交通投资集团限公司招聘348人易考易错模拟试题(共500题)试卷后附参考答案
- 九师联盟2025届高三押题信息卷(四)历史试卷(含答案)
- 江苏省南京2022年中考历史试卷(解析版)
评论
0/150
提交评论