实验四 回溯法的应用------跳马算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四回溯法的应用------跳马算法
学号: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;i<12;i++)
for(j=0;j<12;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] 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;i<12;i++) for(j=0;j<12;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(i3,j3); //递归调用 map[i3][j3]=0; //若还没有走完并且已经没有路走则恢复0状态 }//if }//for kp--;//回朔 }//search int main() { int row, column; char ch; //int start,finsh; while (true) { //打印提示信息 cout<<" 1: 开始程序"< cout<<" 2: 退出程序"< cout<<"注意:"< cout<<""< cout<<"输入选择(1 或2):"< //如果输入信息不正确,继续输入 do{ ch = (char)_getch(); }while(ch != '1' && ch != '2'); system("cls");