网站大量收购独家精品文档,联系QQ:2885784924

回溯算法设计与应用.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯算法设计与应用

实验报告 课程 算法设计与分析实验 实验名称 回溯算法设计与应用 第 1 页 一.基本原理的概括 DFS+剪枝(在状态空间树上作带剪枝的DFS搜索) ?剪枝:若搜索到某结点,其对应的部分解不满足解的约束条件且可断定以其为根的子树上不包含答案结点,则不搜索该子树,直接回到其父结点,继续DFS。 利用回溯法可求问题的一个解,多个解,所有解,最优解,还可判断解的存在性。 二.该类算法设计与实现的要点 回溯法通常包含以下3个步骤: 1)定义给定问题的解空间; 2)确定并表示解的约束条件和其它的剪枝条件; 3)结合剪枝深度优先搜索相应的状态空间树。 注意:回溯法的一个特征是在搜索过程中动态的产生问题的状态空间树,任何时候只存根到当前搜索的结点的路径。 三.实验目的和要求 理解回溯法的基本原理,掌握回溯法设计的基本方法及步骤,并应用于具体问题的解决。 四.实验内容 马的周游问题 问题描述 在n x n棋盘(有n x n个格点的棋盘)的某个格点上有一个中国象棋马,马走日字。求一条周游棋盘的路径,使得马能够从起始位置起沿着该路径每个格点恰好走一次最后回到出发位置。 用回溯法解决该问题。输入一个正整数n,输出一个解,解的输出形式尽可能直观。 3.设计与实现的提示 1)注意可能无解。 2)注意棋盘边界的处理。 三、实验环境 硬件:Windows XP计算机、鼠标、键盘、显示器 开发环境:Microsoft Visual C++ 6.0 四、实验步骤 (描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间结果) 点击开始菜单中的程序-Microsoft Visual C++ 6.0 点击菜单栏中的文件—新建—文件—C++ Source File ,在文件名(N)中写入“实验六.cpp”,再点击确定. 编写程序如下: #includestdio.h #define SIZE 20 int dx[9],dy[9];//方向变量 int tag[SIZE][SIZE]; //tag[x][y]=0表示(x,y)未走过 int k[SIZE]; //k[i]表马第i步走的方向 int ix,iy; //ix,iy用来记住马所在的起始位置 /*------------------------马走日算法---------------------------*/ void house_road(int n,int x,int y) { int i,j,x1,y1,jump=0;//棋盘的大小,jump=0表示当前有路可走 dx[1]=dx[4]=1;//方向数组初始化 dx[2]=dx[3]=2; dx[5]=dx[8]=-1; dx[6]=dx[7]=-2; dy[1]=dy[8]=2; dy[2]=dy[7]=1; dy[3]=dy[6]=-1; dy[4]=dy[5]=-2; for(i=1;i=n;i++)//除虚拟墙外其余位置均可走且还未走 { for(j=1;j=n;j++) tag[i][j]=0; } tag[x][y]=1; ix=x;//记住马的起始位置 iy=y; /*--------------以下是非递归的回溯算法----------------*/ i=1; k[i]=0; k[1]=0; bool flag=false; while(i=1!flag) { while(k[i]8!flag) { k[i]++;//试沿着下一个方向搜索 x1=x+dx[k[i]]; y1=y+dy[k[i]]; if((x1=nx1=1y1=ny1=1)((tag[x1][y1]==0)||(x1==xy1==y)))//位置(x1,y1)可走 { x=x1;y=y1; tag[x][y]=1;//进入新位置 printf((x,y)=(%d,%d)\n,x,y); if(i==n*n)//若已走了所有的点 { flag=true; } else { i++; k[i]=0; } } } i--; tag[x][y]=0; x=x-dx[k[i]]; y=y-dy[k[i]]; } if(!flag) printf(no solution!\n); else { for(

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档