蓝桥杯算法训练 跳马

这篇博客讨论了一个8×8棋盘上的马从初始位置(a,b)到达目标位置(c,d)的最短路径问题。通过使用搜索算法,如深度优先搜索或广度优先搜索,更新棋盘上每个位置的最小步数,来找到最少步数的路径。代码示例展示了如何在C++中实现这一过程,并给出了样例输入和输出。该问题涉及到了图的遍历和最短路径计算,是典型的计算机科学中的路径搜索问题。
摘要由CSDN通过智能技术生成

一,题目描述

资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

问题描述

  一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?

输入格式

  一行四个数字a,b,c,d。

输出格式

  如果跳不到,输出-1;否则输出最少跳到的步数。

样例输入

1 1 2 3

样例输出

1

数据规模和约定

  0<a,b,c,d≤8且都是整数。

二,解决思路

用一个二维数组chess表示棋盘,然后使用搜索算法,每到达一个点,就将代价加一(cost+1),并更新这个点的最小代价,将其存在chess数组中。

代码如下:

#include<iostream> 
#include<stdlib.h>
#include<time.h>
using namespace std;
int chess[8][8];

void search(int x,int y,int cost)//当前位于点(x,y),从(a,b)到达(x,y)的当前最少步数为cost 
{
	//cout<<"("<<x <<","<<y <<"),"<<cost<<endl;
	if(x<0 || 7<x || y<0 || 7<y)return ;//越界就退出函数 
	if(chess[x][y] <10000){//去重 并更新邻接点 
		if(cost < chess[x][y])chess[x][y] = cost;//更新从(a,b)到达(x,y)的最少步数 
		
		int i,j;
		//下面这段for循环代码用来更新 从(a,b)到达(x,y)的八个邻点最少步数 
		for(i=-2;i<=2;i++)
			for(j=-2;j<=2;j++)
			{
				if(i == 0||j == 0)continue;//点(x+i,y+j) 这个点是当前点,不需再更新 
				if(0 <=i+x && i+x<=7 && 0 <=y+j && y+j<=7 && abs(i)+abs(j)==3)
				//上面这个if语句的前半段 0 <=i+x && i+x<=7 && 0 <=y+j && y+j<=7 是为了防止出界,
				//后半段是尝试用 (x+i,y+j)表示点(x,y)的八个邻点。 
				if(chess[i+x][y+j] > cost+1) chess[i+x][y+j] = cost+1;
			}
		return;
	}
	else{
		chess[x][y] = cost;
	}
	//八个方向递归 ,下一步的代价加一 
	search(x+2,y+1,cost+1);
	search(x+2,y-1,cost+1);
	search(x+1,y+2,cost+1);
	search(x+1,y-2,cost+1);
	
	search(x-2,y+1,cost+1);
	search(x-2,y-1,cost+1);
	search(x-1,y+2,cost+1);
	search(x-1,y-2,cost+1);
}
void solution(int a,int b,int c,int d)
{
	//clock_t begin = clock();
	int i,j;
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
			chess[i][j] = 10000;
	search(a-1, b-1, 0);
	if(chess[c-1][d-1] == 10000)cout<<"-1"<<endl;
	else cout<<chess[c-1][d-1];
	
	/*
	for(i=0;i<8;i++)
	{
		for(j=0;j<8;j++)
			cout<<chess[i][j]<<",";
		cout<<endl;
	}*/
	//clock_t end = clock();
	//cout<<end-begin<<endl;
}
int main()
{
	int a,b,c,d;
	//cout<<"test"<<endl;
	cin>>a>>b>>c>>d;
	
	solution(a,b,c,d);
	return 0;
}

运行效果:

 如有错误,敬请指正,礼貌交流,感激不尽。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值