数据结构 马踏棋盘 栈应用 C++

2023-05-16

# include<iostream>
//包含其它头文件
using namespace std;
const int StackInitSize = 10;
const int StackInc = 10;
typedef int SElemType;
struct SStack
{
    SElemType* base, * top;  //栈底指针,栈顶指针
    int stacksize;  //当前分配的存储容量
};
struct ChessStruct
{
    int x, y;  //起点位置
    int X, Y;  //棋盘尺寸
    int** key;
};
bool StackInit(SStack& S)  //栈的初始化
{
    S.base = new SElemType[StackInitSize];
    if (!S.base) return false;
    S.top = S.base;
    S.stacksize = StackInitSize;
    return true;
}
bool Push(SStack& S, SElemType e)  //入栈
{
    SElemType* base;
    if (S.top - S.base == S.stacksize)
    {
        base = (SElemType*)realloc(S.base, (S.stacksize + StackInc) * sizeof(SElemType));
        if (!base) return false;
        S.base = base;
        S.top = S.base + S.stacksize;
        S.stacksize += StackInc;
    }
    *S.top = e;
    S.top++;
    return true;
}
bool Pop(SStack& S, SElemType& e)  //出栈
{
    if (S.top == S.base) return false;
    e = *--S.top;
    return true;
}
bool isEmpty(SStack& S)  //判断栈是否为空
{
    if (S.top == S.base) return true;
    else return false;
}
bool getTop(SStack S, SElemType& e) //获取栈顶元素
{
    if (S.top == S.base)
        return false;
    SElemType* top = S.top - 1;
    e = *top;
    return true;
}

//题目要求的算法
//定义方向
int direction[2][8] = { {1,1,-1,-1,2,2,-2,-2},{2,-2,2,-2,1,-1,1,-1} };
bool judge(int x, int y, int X, int Y)  //判断位置是否在棋盘内
{
    if (x >= 0 && x < X && y >= 0 && y < Y)
        return true;
    else
        return false;
}
//判断某位置是否有路可走
bool NextStep(int x, int y, ChessStruct& Chess, int& flag)  //flag用于记录方向
{
    int X_max, Y_max;
    X_max = Chess.X;
    Y_max = Chess.Y;
    //定义方向
    int direction[2][8] = { {1,1,-1,-1,2,2,-2,-2},{2,-2,2,-2,1,-1,1,-1} };
    int i;
    int tempx, tempy;
    for (i = flag; i < 8; i++)
    {
        if (judge(x + direction[0][i], y + direction[1][i], X_max, Y_max) && Chess.key[x + direction[0][i]][y + direction[1][i]] == 0)  //下一点在棋盘内并且该点没有被走过
        {
            x = x + direction[0][i];
            y = y + direction[1][i];
            flag = i;
            return true;
        }
    }
    return false;
}
void ChessInit(ChessStruct& Chess, int X, int Y, int x, int y)  //棋盘初始化
{
    Chess.X = X;
    Chess.Y = Y;
    Chess.x = x;
    Chess.y = y;
    Chess.key = new int* [X];
    for (int i = 0; i < X; i++)
    {
        Chess.key[i] = new int[Y];
    }
    int i, j;
    for (i = 0; i < X; i++)
    {
        for (j = 0; j < Y; j++)
        {
            Chess.key[i][j] = 0;
        }
    }
}
void PrintChess(ChessStruct &Chess)  //棋盘打印
{
    int i, j;
    for (i = 0; i < Chess.X; i++)
    {
        for (j = 0; j < Chess.Y; j++)
        {
            cout << Chess.key[i][j] << "\t";
        }
        cout << endl;
    }
}
bool houseRun(ChessStruct& Chess)
{
    int X_max, Y_max, x, y;
    X_max = Chess.X;
    Y_max = Chess.Y;
    x = Chess.x;
    y = Chess.y;
    //判断初始位置是否合法
    if (x > X_max - 1 || y > Y_max - 1 || x < 0 || y < 0)
        return false;
    //初始化棋盘
    int step = 1;  //表示步数
    Chess.key[x][y] = 1;
    step++;
    int flag = 0, temp;  //临时变量
    int way;  //记录上一次的方向
    SStack SS;
    StackInit(SS);
    Push(SS, flag);
    while (step < X_max * Y_max + 1)
    {
        Pop(SS, flag);
        if (NextStep(x, y, Chess, flag))  //传入的x, y是当前位置
        {
            x = x + direction[0][flag];
            y = y + direction[1][flag];
            Chess.key[x][y] = step;
            Push(SS, flag + 1);  //存入栈中的是“方向+1”
            Push(SS, 0);
            step++;
        }
        else
        {
            Chess.key[x][y] = 0;
            getTop(SS, temp);
            temp--;  //取出时要方向-1
            step--;
            x = x - direction[0][temp];
            y = y - direction[1][temp];
        }
    }
    return true;
}

int main()
{
    //定义马初始位置
    int x, y;
    x = 0;
    y = 0;
    //定义棋盘尺寸
    int X_max, Y_max;
    X_max = 5;
    Y_max = 5;
    //创建二维棋盘
    struct ChessStruct Chess;
    //棋盘初始化
    ChessInit(Chess, X_max, Y_max, x, y);
    //开始运行
    if (houseRun(Chess))
        PrintChess(Chess);
    else
        cout << "没有路径" << endl;
    return 0;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构 马踏棋盘 栈应用 C++ 的相关文章

随机推荐

  • 将uc/OS其移植到stm32并完成相关任务

    目录 一 uc OS的介绍 1 概述 2 工作原理 3 主要特点 二 创建cubemx项目 1 选择stm32f103c8 2 配置RCC 编辑 3 配置SYS 4 生成项目 三 移植和keil5相关操作 1 进入官网下载 xff1a ht
  • 匿名飞控TI版_PID部分,串级PID,微分先行,前馈控制

    文章目录 PID介绍有趣的故事控制模型位置式PID和增量式PID位置式PID增量式PID 串级PID前馈控制微分先行匿名代码分析 PID介绍 PID介绍 有趣的故事 PID的故事 space space space space space
  • c#委托的定义和使用

    什么是委托 xff1f 当你需要将方法当成一个参数传递的时候就需要使用委托 xff0c 委托是一个类型 xff0c 可以赋值一个方法的引用 具体怎么使用下面就简单展示一下 1 定义委托 delegate void MyDelegate in
  • ssh登录出现 “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”解决办法

    问题场景 xff1a 第一次ssh板子成功登录后 xff0c 换了另外一块同样型号的开发板 xff0c 重新ssh远程登录 xff0c 出现了WARNING REMOTE HOST IDENTIFICATION HAS CHANGED 问题
  • 多线程及网络编程

    目录 实验目的及要求 一 实验原理 xff1a 二 操作步骤 xff1a 三 实验数据 1 模拟火车站4个窗口同时卖50张票 2 使用UDP协议实现用户信息的发送和接收功能 3 运用TCP协议实现向服务器上传文件 实验结果及分析 个人简介
  • 阿里云在线扩容磁盘,最简化,但不一定适用你的ECS版本

    在扩展系统盘扩展分区和文件系统前 xff0c 请提前完成以下工作 已创建快照备份数据 为防止操作失误导致数据丢失 xff0c 建议您操作前使用快照备份数据 若尚未创建快照 xff0c 请参见创建快照 已扩容云盘 若尚未扩容 xff0c 请参
  • AD学习笔记(二)原理图库以及原理图绘制

    文章目录 AD学习笔记第二讲 原理图库以及原理图绘制一 认识原理图二 原理图库绘制三 原理图绘制1 原理图纸的操作2 原理图库的调用放置3 导线及网络标识的添加4 原理图可读性优化处理5 原理图统一编号设置6 PCB封装名称的统一添加与管理
  • C工程与寄存器封装

    目录 一 C语言工程简介 二 启动代码分析 三 C语言实现LED 四 寄存器的封装方式 五 寄存器操作的标准化 六 流水灯 一 C语言工程简介 先将工程模板解压 include里是 h文件 src里是 c文件 start里面是 s启动文件
  • Python第三章函数

    函数 文章目录 函数一 函数基础1 参数2 拆分参数列表3 参数传递位置传递地址传递传对象引用 4 函数返回值5 变量的作用域局部变量全局变量nonlocal关键字 7 包8 猴子补丁9 python标准库的应用1 random模块2 ti
  • 无显示器怎么玩树莓派

    无显示器怎么玩树莓派 文章目录 无显示器怎么玩树莓派 前言一 给树莓派烧系统二 设置WiFi及ssh端口三 远程连接四 注意事项 前言 很多时候我们在使用树莓派的时候身边都没有显示器 xff0c 关于这个问题 xff0c 我也十分苦恼 xf
  • ROS智能车定位导航仿真(Gazebo搭建赛道)

    ROS智能车定位导航仿真 xff08 Gazebo搭建赛道 xff09 前言一 ROS仿真功能包下载二 安装运行所需的插件三 racecar功能包编译四 测试程序运行五 运行功能包赛道六 注意事项 前言 Ubuntu版本 xff1a 18
  • 阿木实验室PX4开发课程整理

    1 1 xff1a alt 43 ctrl 43 t 打开终端 cd Desktop 进入到桌面目录 cd 返回上次访问目录 cd 返回上一目录 gedit circular cpp 进入某文件 roscd px4 control 进入文件
  • Java并发编程—CompletableFuture的异步执行案例

    在博主前几篇博客中 xff0c https blog csdn net qq 52545155 article details 128167519 spm 61 1001 2014 3001 5501 xff0c 给大家分享了关于多线程中异
  • 手写rtos的第一天

    唉 xff0c 不自不觉已经大三了啊 xff0c 大二的智能车生涯已经结束了 xff0c 不得不说 xff0c 省二是我不太能接受的 结果 xff0c 虽然嘴上说着没啥 xff0c 真正面对全省排名的时候 xff0c 内心的寂寥真的难以言表
  • FreeRTOS任务(动态)创建与删除(一)

    FreeRTOS学习总结 文章目录 前言一 浅浅了解二 创建任务1 动态任务创建2 动态实践 总结 前言 听朋友说 xff0c FreeRTOS很好用 xff0c 就在无聊的上网课期间浅学一下 提示 xff1a 以下是本篇文章正文内容 xf
  • FreeRTOS操作系统队列及队列API函数(五)

    FreeRTOS学习总结 文章目录 前言一 队列功能1 数据存储2 多任务访问3 出队阻塞4 入队阻塞 二 队列操作过程图示1 创建队列2 向队列发送第一个消息3 向队列发送第二个消息4 从队列中读取消息 二 API函数1 队列创建函数2
  • php导出word文件,打开损坏或者乱码

    下载Word文件 fileinfo 61 pathinfo fullname ob end clean header 39 Content type application x 39 fileinfo 39 extension 39 hea
  • FreeRTOS操作系统优先级翻转问题(八)

    FreeRTOS总结 文章目录 前言一 浅浅了解优先级翻转二 模拟 优先级翻转实验1 代码 总结 前言 在使用二值信号量的时候会遇到很常见的一个问题 优先级翻转 xff0c 优先级翻转在可剥夺 内核中是非常常见的 xff0c 在实时系统中不
  • 伽马分布,指数分布,卡方分布三者关系

    1 伽马分布是一个连续概率分布 xff0c 具有两个参数 alpha 和 lambda xff0c 记为
  • 数据结构 马踏棋盘 栈应用 C++

    include lt iostream gt 包含其它头文件 using namespace std const int StackInitSize 61 10 const int StackInc 61 10 typedef int SE