问题描述
一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?
输入格式
一行四个数字a,b,c,d。
输出格式
如果跳不到,输出-1;否则输出最少跳到的步数。
样例输入
1 1 2 3
样例输出
1
数据规模和约定
0<a,b,c,d≤8且都是整数。
这道题是经典的跳马搜素问题,可以选择BFS、DFS,BFS用时会小一点,毕竟DFS会回溯。由于博主的能力限制,本题会用DFS算法解答,注释附在代码上。
代码语言:javascript复制#include<iostream>
using namespace std;
int a,b,c,d;
int vis[10][10];//标记数组
int sum=64;//能到达的方法数,最大为8*8的格子全部走一遍,初始值为8*8,因为要找最小值
int dx[]={1,1,-1,-1,2,2,-2,-2};//方向数组X
int dy[]={2,-2,2,-2,1,-1,1,-1};//方向数组Y
void dfs(int x,int y,int dep){//dfs搜索
if(dep>=sum){//如果当前步数大于最小步数则没有意义继续搜下去了,直接return
return;
}
if(x==c&&y==d){//到达终点坐标(c,d)
if(dep<sum){//判断步数是否小于最小步数,小于就更新
sum=dep;
}
return;
}
for(int i=0;i<8;i ){//8个方向搜索
int bx=x dx[i];
int by=y dy[i];
if(vis[bx][by]==1){//已经走过就不走了
continue;
}
if(bx<=0||bx>8||by<=0||by>8){//不在边界范围内也不走
continue;
}//判断完说明该点可以走
vis[bx][by]=1;//走就标记为走过
dfs(bx,by,dep 1);//继续dfs
vis[bx][by]=0;//回溯,解标记
}
}
int main(){
cin>>a>>b>>c>>d;
vis[a][b]=1;//先把起点标记为走过,不然对后面搜索有影响
dfs(a,b,0);//起点开始搜索
if(sum==64){//如果sum还等于64,就说明sum就没有被更新过,也就是说根本到达不了终点
cout<<-1;
}else{
cout<<sum;
}
return 0;
}
最后,博主也去提交验证了一下,AC了。
本人小白一枚,能力有限,希望各位大佬理解。本文有错误的地方请指出,共同进步。