【算法设计】回溯法算法设计——骑士游历问题(C++实现)

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法分析与设计知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


骑士游历问题

问题描述

在国际象棋的棋盘(8行×8列)上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并且每格只到达一次。

若给定起始位置(x0,y0),编程探索出一条路径,沿着这条路径马能遍历棋盘上的所有单元格

算法思想和解题思路

马从棋盘上的某一初始位置(x0,y0)开始,每次选择一个方向k,向前走一格,直到走完64格为止。每走一格,设置数组中相应格的元素值为马走的步数。

如果选择的方向k=0,表示可能的8种走向都试探不通,不通的原因是走向超出了棋盘范围,或当前位置已经被马访问过。此时马已无路可走,说明前几步走得不对,应该退回去重新换一种走法。

C++代码

#include<iostream>
#include<iomanip>
using namespace std;
const int N = 8;
int travel[8][8] = { 0 };  
int record = 0; 
bool isVisited(int i, int j)
{
	if (travel[i][j] == 0) return false;
	else return true;
}
bool isCrossBorder(int i, int j) {
	if (i >= 0 && i < N && j >= 0 && j < N) return false;
	else return true;
}
void search(int x, int y) {
	if (record == N * N)  return;
	if (!isVisited(x, y) && !isCrossBorder(x, y)) {
		record++;
		travel[x][y] = record;
		search(x + 1, y + 2); 
		search(x + 2, y + 1);
		search(x + 2, y - 1);
		search(x + 1, y - 2);
		search(x - 1, y - 2);
		search(x - 2, y - 1);
		search(x - 2, y + 1);
		search(x - 1, y + 2);
		return;
	}
	return;
}
int main() {
	int x,y;
	cout << "请输入起始点位置:";
	cin >> x;
	cin >> y;
	search(x, y);
	for (int row = 0; row < N; row++) {
		for (int column = 0; column < N; column++)
		{
			cout << setw(2) << travel[row][column] << " ";
		}
		cout << endl;
	}
	return 0;
}

在这里插入图片描述


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值