蓝桥 试题 算法训练 跳马 C++

2024-09-23 16:32:03 浏览数 (2)

问题描述

  一个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了。

 本人小白一枚,能力有限,希望各位大佬理解。本文有错误的地方请指出,共同进步。

0 人点赞