数据结构与算法——马踏棋盘(c++栈实现)

2023-11-14

马踏棋盘问题是旅行商(TSP)或哈密顿问题(HCP)的一个特例。在国际棋盘棋盘上,用一个马按照马步跳遍整个棋盘,要求每个格子都只跳到一次,最后回到出发点。这是一个 NP问题,通常采用回溯法或启发式搜索类算法求解。 

在此采用栈进行回溯法求解

#include <iostream>
#include<stdlib.h>
#include <stdio.h>
#include <iomanip>
using namespace std;
const int StackInitSize=10;
const int StackInc=1;
typedef struct {
    int x;
    int y;
} Position;
typedef struct
{
    int n=5;//迷宫规模n*n
    int Board[10][10]={{0}};//棋盘最大规模
    Position start;//马开始位置
}ChessBoard;
typedef struct {
    int ord;
    //顺序(第几步)
    Position seat;
    //位置
    int di;
    //查找方向
} SElemType;//马的当前状态
struct SStack
{
    SElemType * base,*top;
    int stacksize;
};
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;
    S.top--;
    e=*S.top;
    return true;
}
void HorseOnBoard(int n,int x,int y)
{
    ChessBoard CBoard;
    CBoard.start.x=x;
    CBoard.start.y=y;
    CBoard.n=n;
    int h_move[8][2]={{2,1},{-1,2},{1,2},{-2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
    int step=0;
    int i=0;
    SStack S;
    StackInit(S);
    Position p=CBoard.start;
    SElemType horse;
    horse.di=0;
    horse.ord=step;
    horse.seat=CBoard.start;
    Push(S,horse);
do{
       bool f=Pop(S,horse);
       if(!f)
           break;
       if (step>=1)
        {
            i=horse.di+1;
            CBoard.Board[horse.seat.x][horse.seat.y]=0;
            step--;

        }
        for(i;i<8;i++)
        {
            p.x=horse.seat.x+h_move[i][0];
            p.y=horse.seat.y+h_move[i][1];
            if(CBoard.Board[p.x][p.y]==0&&(p.x<=CBoard.n-1)&&(p.x>=0)&&(p.y<=CBoard.n-1)&&(p.y>=0))
            {
                step++;
                horse.di=i;
                horse.ord=step;
                Push(S,horse);
                CBoard.Board[horse.seat.x][horse.seat.y]=step;
                horse.seat=p;
                i=0;

                if(step==CBoard.n*CBoard.n-1)
                {
                    step++;
                    CBoard.Board[horse.seat.x][horse.seat.y]=step;
                    Push(S,horse);
                }
                continue;
            }

        }

    }while(step<CBoard.n*CBoard.n-1);

    if(step<CBoard.n*CBoard.n)
       cout<<"找不到合适的路径"<<endl;
    else
    {
          cout<<"马在"<<n<<"*"<<n<<"的棋盘上的足迹如下:"<<endl;
          for (int a = 0; a < n; a++) {
            for(int b = 0; b < n; b++) {
                cout<<setw(2)<<CBoard.Board[a][b]<<setw(2)<<' ';
                }
            cout<<' '<<endl;
    }
    }

}
int main()
{
    HorseOnBoard(5,0,0);
    return 0;
}

 

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

数据结构与算法——马踏棋盘(c++栈实现) 的相关文章

随机推荐

  • Nacos快速入门(二):Nacos集群安装部署

    1 集群部署架构图 官方提供了三种部署架构 http ip1 port openAPI 直连ip模式 机器挂则需要修改ip才可以使用 http VIP port openAPI 挂载VIP模式 直连vip即可 下面挂server真实ip 可
  • 基于Taro + 云开发 打造婚礼邀请函

    趣婚礼 基于Taro2 云开发 打造婚礼邀请函 项目名称 趣婚礼 基于Taro2 云开发 打造婚礼邀请函 Taro2 云开发 项目介绍 结婚的时候婚礼邀请函是一道必不可少的程序 但是没法去很好的留存我们的数据和回忆 除非有后端支持 最近刚好
  • java 面试的常用问题

    ArrayList 和 LinkedList 的区别 数据结构层面 ArrayList 是动态数组的数据结构 LinkedList是链表的数据结构 数据操作层面 对于随机访问get和set ArrayList优于LinkedList 对于新
  • PyQt(Python+Qt)学习随笔

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt moviepy音视频剪辑实战 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 PyQt学习随笔 PyQt Python Q
  • EBNF范式

    1 巴科斯范式 巴科斯范式 BNF Backus Naur Form 的缩写 是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集 现在 几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语
  • web前端入门到实战:CSS遮罩效果、阴影效果、毛玻璃效果

    一般遮罩 background 000 在body标签的最后加上div标签作为遮罩 如下 div class mask div css样式 mask position fixed top 0 left 0 bottom 0 right 0
  • Thrift之TProtocol类体系原理及源码详细解析之JSon协议类TJSONProtocol

    我的新浪微博 http weibo com freshairbrucewoo 欢迎大家相互交流 共同提高技术 JSON JavaScriptObjectNotation 是一种数据交换格式 是以JavaScript为基础的数据表示语言 是在
  • vant框架DropdownMenu 下拉菜单组件在小程序中的应用

    vant框架DropdownMenu 下拉菜单组件在小程序中的应用 官方文档实例
  • Grafana Kubernetes部署(rancher)

    1 相关资源导航 https blog csdn net zyj81092211 article details 122917786 2 环境介绍 kubernetes版本 v1 23 4 rancher版本 v2 6 3 容器相关环境配置
  • 获取服务器信息失效,获取服务器时间失败

    获取服务器时间失败 内容精选 换一换 安装完Mind Studio后 如果用户进行编译运行相关操作 则需要参见该章节 将硬件环境的lib库同步到Mind Studio安装服务器 已经完成安装 请确保DDK版本号与硬件环境所安装的软件包版本号
  • IO(输入/输出)

    用户态和内核态 用户态 用来运行应用程序 不能直接对操作系统进行调用 而是需要切换到内核态对操作系统进行操作 内核态 直接访问操作系统资源或运行操作系统程序 例如程序要保存一个文件到硬盘 在程序执行的用户态 是直接操作磁盘的 只有切换到内核
  • Socket编程之聊天室

    1 单线程模式 创建服务端 第一步 准备地址和端口 第二步 创建一个ServerSocket对象 第三步 等待客户端连接 最后一步 数据接收和发送 public class SingleThreadServer public static
  • Linux线程同步

    1 同步 同步即协同步调 按预定的先后次序运行 线程同步 指一个线程发出某一功能调用时 在没有得到结果之前 该调用不返回 同时其它线程为保证数据一致性 不能调用该函数 解决同步的问题 加锁 2 数据混乱原因 1 资源共享 独享资源则不会 2
  • ubuntu-16.04 安装虚拟机工具时报错

    2019独角兽企业重金招聘Python工程师标准 gt gt gt root alex virtual machine home alex Desktop vmware tools distrib vmware install pl ope
  • Mathtype公式编辑软件 安装教程

    文章目录 1 MathType公式编辑器 介绍 2 MathType 安装 2 1 下载包 2 2 安装源程序 2 3 安装补丁 4 验证是否安装成功 我们再写论文时 一般都明确要求 公式必须用MathType编辑 所有公式必须在MathT
  • 什么是软件外包公司?要不要去外包公司?

    关注后回复 进群 拉你进程序员交流群 作者丨土豆居士 来源丨一口Linux ID yikoulinux 一 什么是外包 软件外包分为 人力外包和项目外包两个方向 1 劳务派遣 指的是把员工外派到对应的用工企业打 短工 比如很多工程师虽然签约
  • SpringBoot总结

    一 SpringBoot简介 1 入门案例 SpringMVC的HelloWord程序大家还记得吗 SpringBoot是由Pivotal团队提供的全新框架 其设计目的是用来简化Spring应用的初始搭建以及开发过程 原生开发SpringM
  • 153个!PCB板上的字母符号都代表啥?一图带你搞懂!

    PCB板是基于电路设计图而生产的 看过电路设计图的小伙伴都会知道 上面有各种物理电学标准符号 通过分析电路设计图 可以得知将使用哪些电子元器件 各元器件之间的关系 以及该电路具备哪些性能 为此 小编在网络上搜集了一些电工电路图常用的字母符号
  • 石锤!谷歌排名第一的编程语言,死磕这点,程序员都收益

    日本最大的证券公司之一野村证券首席数字官马修 汉普森 在Quant Conference上发表讲话 用Excel的人越来越少 大家都在码Python代码 甚至直接说 Python已经取代了Excel 事实上 为了追求更高的效率和质量 他们开
  • 数据结构与算法——马踏棋盘(c++栈实现)

    马踏棋盘问题是旅行商 TSP 或哈密顿问题 HCP 的一个特例 在国际棋盘棋盘上 用一个马按照马步跳遍整个棋盘 要求每个格子都只跳到一次 最后回到出发点 这是一个 NP问题 通常采用回溯法或启发式搜索类算法求解 在此采用栈进行回溯法求解 i