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

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


目录

  • 骑士游历问题
    • 问题描述
    • 算法思想和解题思路
    • C++代码

骑士游历问题

问题描述

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

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

算法思想和解题思路

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

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

C++代码

#include
#include
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;
}

【算法设计】回溯法算法设计——骑士游历问题(C++实现)_第1张图片


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

你可能感兴趣的:(算法分析,算法,c++,开发语言,学习,笔记)