数据结构课程设计-马踏棋盘_第1页
数据结构课程设计-马踏棋盘_第2页
数据结构课程设计-马踏棋盘_第3页
数据结构课程设计-马踏棋盘_第4页
数据结构课程设计-马踏棋盘_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档数据结构课程设计报告设计题目: 马踏棋盘院 系 计算机学院 年 级 11 级 学 生 xxxxxxx 学 号 xxxxxxxxx 指导教师 xxxxxxxxx 起止时间 9-6/9-13 2013年9月10日星期二目 录一、 课程设计目的 -3二、 需求分析-3三、程序源代码- 4四、调试分析-7五、问题总结-8六、参考资料-9 一、 课程设计目的(1) 熟练使用 C 语言编写程序,解决实际问题;(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等根本方法和技能;(4) 提高综合运用所学的理论知识和

2、方法独立分析和解决问题的能力; 二、 需求分析问题描述:将马随机放在国际象棋的 8X8 棋盘中的某个方格中,马按走棋规那么进行移动。要求每个方格上只进入一次,走遍棋盘上全部 64 个方格。编制递归程序,求出马的行走路线 ,并按求出的行走路线,将数字 1,2,64 依次填入 8X8 的方阵输出之。测试数据:由读者指定可自行指定一个马的初始位置。实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯悔棋使用。并探讨每次选择位置的“最正确策略,以减少回溯的次数。背景介绍:国际象棋为许多令人着迷的娱乐提供了固定的框架,而这些框架常独立于游

3、戏本身。其中的许多框架都基于骑士奇异的L型移动规那么。一个经典的例子是骑士漫游问题。从十八世纪初开始,这个问题就引起了数学家和解密爱好者的注意。简单地说,这个问题要求从棋盘上任一个方格开始按规那么移动骑士,使之成功的游历国际象棋棋盘的64个方格,且每个方格都接触且仅接触一次。可以用一种简便的方法表示问题的一个解,即将数字1,64按骑士到达的顺序依次放入棋盘的方格中。一种非常巧妙的解决骑士漫游地方法由J.C.Warnsdorff于1823年给出。他给出的规那么是:骑士总是移向那些具有最少出口数且尚未到达的方格之一。其中出口数是指通向尚未到达方格的出口数量。在进一步的阅读之前,你可以尝试利用War

4、nsdorff规那么手工构造出该问题的一个解。实习任务:编写一个程序来获得马踏棋盘即骑士漫游问题的一个解。您的程序需要到达下面的要求:棋盘的规模是8*8;对于任意给定的初始化位置进行试验,得到漫游问题的解;对每次实验,按照棋盘矩阵的方式,打印每个格被行径的顺序编号。技术提示:解决这类问题的关键是考虑数据在计算机中的存储表示。可能最自然的表示方法就是把棋盘存储在一个8*8的二维数组board中。以(x,y)为起点时骑士可能进行的八种移动。一般来说,位于(x,y)的骑士可能移动到以下方格之一:(x-2,y+1)、(x-1,y+2)、(x+1,y+2)、(x+2,y+1)、(x+2,y-1)、(x+

5、1,y-2)、(x-1,y-2)、(x-2,y-1)。但请注意,如果(x,y)的位置离某一条边较近,有些可能的移动就会把骑士移到棋盘之外,而这当然是不允许的。骑士的八种可能的移动可以用一个数组MoveOffset方便地表示出来:MoveOffset0=(-2,1)MoveOffset1=(-1,2)MoveOffset2=(1,2)MoveOffset3=(2,1)MoveOffset4=(2,-1)MoveOffset5=(1,-2)MoveOffset6=(-1,-2)MoveOffset7=(-2,-1)于是,位于(x,y)的骑士可以移动到(x+MoveOffsetk.x, y+Move

6、Offsetk.y),其中k是0到7之间的某个整数值,并且新方格必须仍位于棋盘上。扩展需求:可以考虑将结果图形化。(b)考察所有初始化的情况,测试是否都能够得到解。三、程序源代码#include<stdio.h>#include<stdlib.h>#define MAXSIZE 100#define N 8int board88; /定义棋盘int Htry18=1,-1,-2,2,2,1,-1,-2; /*存储马各个出口位置相对当前位置行下标的增量数组*/int Htry28=2,-2,1,1,-1,-2,2,-1; /*存储马各个出口位置相对当前位置列下标的增量数组

7、*/struct Stack /定义栈类型 int i; /行坐标int j; /列坐标 int director; /存储方向stackMAXSIZE; /定义一个栈数组int top=-1; /栈指针void InitLocation(int xi,int yi); /马在棋盘上的起始位置坐标int TryPath(int i,int j); /在每个方向进行尝试,直到试完整个棋盘void Display(); /输出行走的路径void InitLocation(int xi,int yi)int x,y; /定义棋盘的横纵坐标变量top+; /栈指针指向第一个栈首stacktop.i=x

8、i; /将起始位置的横坐标进栈stacktop.j=yi; /将起始位置的纵坐标进栈stacktop.director=-1; /将起始位置的尝试方向赋初值boardxiyi=top+1; /标记棋盘x=stacktop.i; /将起始位置的横坐标赋给棋盘的横坐标y=stacktop.j; /将起始位置的纵坐标赋给棋盘的纵坐标if(TryPath(x,y) /调用马探寻函数,如果马探寻整个棋盘返回1否那么返回0Display(); /输出马的行走路径else printf("无解"); int TryPath(int i,int j)int find,director,nu

9、mber,min; /临时变量int i1,j1,h,k,s; /临时变量int a8,b18,b28,d8; /临时数组while(top>-1) /栈不空时循环for(h=0;h<8;h+) /用数组a8记录当前位置的下一个位置的可行路径的条数number=0; i=stacktop.i+Htry1h; j=stacktop.j+Htry2h; b1h=i; b2h=j; if(boardij=0&&i>=0&&i<8&&j>=0&&j<8) /如果找到下一位置for(k=0;k<8;

10、k+)i1=b1h+Htry1k; j1=b2h+Htry2k; if(boardi1j1=0&&i1>=0&&i1<8&&j1>=0&&j1<8) /如果找到下一位置 number+; /记录条数 ah=number; /将条数存入数组a8中 for(h=0;h<8;h+) /根据可行路径条数小到大按下表排序放入数组d8中min=9; for(k=0;k<8;k+)if(min>ak) min=ak; dh=k; /将下表存入数组d8中 s=k; as=9; director=stack

11、top.director; if(top>=63) /假设走完整个棋盘返回1return (1);find=0; /没有找到下一个位置for(h=director+1;h<8;h+) /向八个方向进行尝试i=stacktop.i+Htry1dh; j=stacktop.j+Htry2dh;if(boardij=0&&i>=0&&i<8&&j>=0&&j<8) /如果找到下一位置find=1; /表示找到下一个位置break;if(find=1) /如果找到下一个位置进栈stacktop.dire

12、ctor=director; /存储栈结点的方向 top+; /栈指针前移进栈stacktop.i=i;stacktop.j=j;stacktop.director=-1; /重新初始化下一栈结点的尝试方向boardij=top+1; /标记棋盘else /否那么退栈boardstacktop.istacktop.j=0; /去除棋盘的标记top-; /栈指针前移退栈return (0); void Display()system("color 1e"); int i,j; for(i=0;i<N;i+)for(j=0;j<N;j+)printf("t

13、%d ",boardij); /输出马儿在棋盘上走过的路径printf("nn");printf("n");void main()system("cls");system("color 0d");printf("n");printf(" 选做题,骑士漫游 n");printf(" 姓名:xxxx n");printf(" 学号:xxxxxxxxx n");printf("n");printf("

14、>>>n");printf("n");printf("欢送进入骑士漫游小游戏! n");printf("n");int i,j;int x,y;for(i=0;i<N;i+) /初始化棋盘 for(j=0;j<N;j+) boardij=0;for(;)printf(">>>.请输入初始位置坐标(x,y) 注:(1,1)-(8,8)n");printf("Input x = ");scanf("%d",&x);

15、 /输入起始位置的横坐标printf("Input y = ");scanf("%d",&y); /输入起始位置的纵坐标if(x>=1&&x<=8|y>=1&&y<=8)break;printf("n输入有误,请重新输入!nn");printf("骑士从第%d行,第%d列开始漫游:n",x,y);InitLocation(x-1,y-1); /调用起始坐标函数四、调试分析1. 开始界面2.输入坐标五、问题总结此次数据结构课程设计我组设计的是一个利用栈递归得到的马踏遍棋盘的演示程序,刚看题目时候觉得还比拟困难,根本没一点思绪,但通过在网上查找相关资料,对这个问题才有了一定的思绪。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论