- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验四 回溯法的应用------跳马算法
实验四 回溯法的应用------跳马算法
学号:012124345 姓名:梁文耀
一、 实验目的
掌握使用回溯法求解问题的基本思路;理解其特点。
二、实验思想
算法的基本思路是:
定义结构体:struct PLACE{int x, int y}表示棋盘上的位置。
依题意,马每跳一步之后都可以从七个不同的方向选择下一步的跳马,当然,前提是跳的这一步在棋盘内且它前面的任何一步都没跳到这一格子上(限界),就可以认为这一步跳成功,否则跳马不成功。若跳马不成功,则找下一个方向尝试跳马,若七个方向都跳马不成功,则回溯。
假设棋盘的行(列)数为n。
在本算法中设置这样一个全局数组:c[8][2]={{2,1},{2,-1},{1,2},{1,-2},{-2,1},{-2,-1},{-1,2},{-1,-2}}; 来记录跳马的八个方向。
三、程序分析(主要算法)
int map[12][12], status[12][12], kp;
int start,finsh;
int c[8][2]={{2,1},{2,-1},{1,2},{1,-2},
{-2,1},{-2,-1},{-1,2},{-1,-2}};
int flag = 0;
void prt(int a[][12]) /* 打印棋盘状态 */
{
int i,j;
printf(\n);
for (i=2;i=9;i++)
{
for (j=2;j=9;j++)
printf(%4d,a[i][j]);
printf(\n);
}
}
void status2(void) /* 计算棋盘各点条件数 */
{
int i,j,k,i2,j2,kz;
for(i=0;i12;i++)
for(j=0;j12;j++)
status[i][j]=100;
for(i=2;i=9;i++)
for(j=2;j=9;j++)
{
kz=0;
for (k=0;k=7;k++)
{
i2=i+c[k][0];
j2=j+c[k][1];
if (map[i2][j2]50) kz++;
}
status[i][j]=kz;
}
//prt(status);
}
void sort1(int b1[],int b2[]) /* 对8个可能的方向按条件数排序 */
{
int i,j,mini,t; /*b1[]记录状态值(升序),b2[]记录排序后的下标 */
for (i=0;i=7;i++)
{
mini=i;
for (j=i+1;j=7;j++)
if (b1[j]b1[mini]) mini=j;
t=b1[i]; b1[i]=b1[mini]; b1[mini]=t;
t=b2[i]; b2[i]=b2[mini]; b2[mini]=t;
}
}
void init1(void) /* 初始化 */
{
int i,j;
for(i=0;i12;i++)
for(j=0;j12;j++)
map[i][j]=100;
for(i=2;i=9;i++)
for(j=2;j=9;j++)
map[i][j]=0;
status2();
}
void search(int i2,int j2) /* 利用递归回溯进行搜索 */
{
if (flag == 1)
return ;
int b1[8],b2[8],i,i3,j3;
kp++;
for(i=0;i=7;i++)//8个方向
{
b2[i]=i;
b1[i]=status[i2+c[i][0]][j2+c[i][1]];
}//for
sort1(b1,b2);
for(i=0;i=7;i++)//检查是否可以走
{
i3=i2+c[b2[i]][0]; //按照排序中的方向查找
j3=j2+c[b2[i]][1];
if (map[i3][j3]==1 kp==65)
{
prt(map);
flag = 1;
}
if (map[i3][j3]==0)//若有路可以走,则执行下面操作
{
map[i3][j3]=kp;
search(
文档评论(0)