- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
10122157项镇敏实验6跳马问题ok
《算法设计与分析实验》
实验报告
实验指导教师 沈云付
学生姓名 项镇敏
学号
序号 1
实验时间 周三7-9节课
上海大学计算机工程与科学学院
2016年11月3日
实验六、跳马问题
问题描述:
给定8*8方格棋盘,
实验目的:
求棋盘上一只马从一个位置到达另一位置的最短路径长。
算法思想:
1.简单分析,说明原理或方法
依旧是最短路径问题,不过此问题用回溯法来求解释比较好的。如下:
一只马在棋盘的某一点,它可以朝8个方向前进,方向向量分别是:(2,1)、(2,-1)、(1,2)、(1,-2)、(-2,1)、(-2,-1)、(-1,2)、(-1,-2)。从中任选择一个方向前进,到达新的位置。在从新的位置选择一个方向前进,继续,直到无法前进为止。无法前进可能有如下原因:下一位置超出边界、下一位置已经被访问过。当马已经无法前进时,就回退到上一位置,从新选择一个新的方向前进;如果还是无法前进,就再回退到上一位置……
算法复杂度分析:
在任何时刻,回溯算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))。而显式地存储整个解空间则需要O(2h(n))或O(h(n)!)内存空间。
2.给出能正确运行的程序:
程序代码见附录。
以下是输入输出要求以及实验结果截图:
输入要求:
输入有若干测试数据。
每组测试数据仅1行,每行上有2个方格pos1、pos2,之间用一个空格隔开,每格方格表示棋盘上的一个位置,该位置由表示列的1个字母(a-h)及表示行的一个数字(1-8)构成,如“d7”表示第4列第7行。
输出要求:
对输入中每行上的2个方格pos1、pos2,输出马从位置pos1跳到pos2所需的最短路径长。如“a1==a2: 3 moves”表示从位置a1跳到a2所需的最少步数是3。
注意:按输出样例所示格式输出,如“a1==a2: 3 moves”中冒号后有一个空格,再跟着所需的最少步数。
实验结果
实验报告要求:
3.设计、调试中的问题及实验体会。
回溯法,我们要知道回溯法的基本思想,以及生成问题的基本方法。在一般情况下,用递归回溯法求解问题比较好。
附录:
#includeiostream
using namespace std;
class stack{
private:
int a[100],b[100];
int posx;
public:
stack():posx(0){}
void push(int x,int y){
a[posx]=x;
b[posx]=y;
posx++;
}
void pop(int x,int y){
posx--;
x=a[posx];
y=b[posx];
}
bool empty()
{
if(posx==0)
return true;
else
return false;
}
};
void jump(int row,int col,int a[8][8])
{
int r,c;
a[row][col]=0;
r=row;
c=col;
stack st;
st.push(r,c);
while(!st.empty()) {
st.pop(r,c);
//左上角
if(r0 c1 a[r-1][c-2]==-1){
a[r-1][c-2]=a[r][c]+1;
st.push(r-1,c-2);
}
else if(r0 c1 a[r-1][c-2]a[r][c]+1){
a[r-1][c-2]=a[r][c]+1;
st.push(r-1,c-2);
}
if(r1 c0 a[r-2][c-1]==-1){
a[r-2][c-1]=a[r][c]+1;
st.push(r-2,c-1);
}
else if(r1 c0 a[r-2][c-1]a[r][c]+1){
a[r-2][c-1]=a[r][c]+1;
st.push(r-2,c-1);
}
//右上角
if(r0 c6 a[r-1][c+2]==-1){
a[r-1][c+2]=a[r][c]+1;
st.push(r-1,c+2);
}
else if(r0 c
文档评论(0)