- 吐吐很快乐
经典搜索算法--跳马
- 2025-6-1 16:14:43 @
标准注释版
#include<bits/stdc++.h>
using namespace std;
// 全局变量定义
int a[100][3]; // 存储跳跃路径:a[跳跃步数][0]未使用,a[][1]=x坐标,a[][2]=y坐标
int t = 0; // 记录成功到达终点的路径总数
// 马跳跃的四种规则(马走日):方向数组
int x[4] = {2, 1, -1, -2}; // x方向移动:向右2格,向右1格,向左1格,向左2格
int y[4] = {1, 2, 2, 1}; // y方向移动:向上1格,向上2格,向上2格,向上1格
// 函数声明
int search(int step); // 搜索函数:寻找下一步跳跃位置
int print(int step); // 打印函数:输出成功到达终点的路径
int main() // 主程序
{
// 设置起点位置(0,0)
a[1][1] = 0; // 第一步的x坐标
a[1][2] = 0; // 第一步的y坐标
// 从第二步开始搜索可能的跳跃路径
search(2);
return 0;
}
// 搜索函数:递归寻找马跳跃的路径
// 参数step:当前是第几步跳跃
int search(int step)
{
// 尝试四个可能的跳跃方向
for (int j = 0; j <= 3; j++)
{
// 计算跳跃后的新位置
int new_x = a[step-1][1] + x[j]; // 新位置的x坐标
int new_y = a[step-1][2] + y[j]; // 新位置的y坐标
// 检查新位置是否在棋盘范围内(x:0-4, y:0-8)
if (new_x >= 0 && new_x <= 4 && new_y >= 0 && new_y <= 8)
{
// 保存当前位置到路径中
a[step][1] = new_x; // 记录当前步的x坐标
a[step][2] = new_y; // 记录当前步的y坐标
// 检查是否到达终点(4,8)
if (new_x == 4 && new_y == 8)
print(step); // 到达终点,打印路径
else
search(step + 1); // 未到达终点,继续下一步跳跃
}
}
}
// 打印函数:输出成功到达终点的路径
// 参数step:总共用了多少步到达终点
int print(int step)
{
t++; // 路径总数加1
cout << t << ": "; // 输出路径编号
// 输出路径中的每一步(除了最后一步)
for (int i = 1; i <= step - 1; i++)
cout << a[i][1] << "," << a[i][2] << "-->";
// 输出终点位置
cout << "4,8" << endl;
}
0 条评论
目前还没有评论...