创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法分析与设计知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
目录
- 骑士游历问题
- 问题描述
- 算法思想和解题思路
- 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;
}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |