马踏棋盘求----全部解

2023-10-30

标题:运用栈和回溯法求马踏棋盘的全部解

回溯法的写法参考《数据结构–严蔚敏》的迷宫求解
感谢我的队友-汪汪汪
他与求一个解不同之处在于,当我们求到一个解之后,这个程序却会告诉计算机:“啊!这不是我们想要的解,我们继续吧。”于是,傻傻的计算机就信了我们的话,跳过这个这个解,继续求下一个。当他走完所有可能之后,他才会退出循环,然后告诉我们,我已经求出全部解了。
下面是我求出的解,目前我已经求出三千多个解了,但是1 2 3 点还是没有移动,显然解是有很多的。而且我们发现每个解最后一个位置都是相同的,36都是在同一个点,难道当我们确定前面某几步之后,最后一个点就一定可以确定下来吗?从观察的结果来看,似乎是这样的。里边似乎有着更加深奥的数学知识。
我对此很好奇,但我并不想再去对这个问题进行探究。希望看到这个文章的读者们,能解答我的疑惑,并将你的看法发表在评论区内。欢迎大家积极评论。God bless you

在这里插入图片描述

#include <iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define STACK_INIT_SIZE 200
#define INCREASE 10
#define AddRow 10
#define AddCol 10
int Chess[AddRow][AddCol];
typedef struct
{
 int x;
 int y;
}PosType;
typedef struct
{
 int ord;
 PosType seat;
 int di;
}SElemType;
typedef struct
{
 SElemType* base;
 SElemType* top;
 int stacksize;
}SqStack;
int curstep = 1;
bool InitStack(SqStack& S);
bool Push(SqStack& S, SElemType e);
bool Pop(SqStack& S, SElemType& e);
bool GetTop(SqStack S, SElemType& e);
bool StackEmpty(SqStack S);
bool Pass(PosType curpos)
{
 int x = curpos.x, y = curpos.y;
 if (Chess[x][y] == 0)
  return true;
 else
  return false;
}
void ChessPrint()
{
 //输出棋盘结构
 int i, j;
 for (i = 0; i < AddRow; i++)
 {
  for (j = 0; j < AddCol; j++)
   printf("%3d", Chess[i][j]);
  printf("\n");
 }
}
void MarkPrint(PosType curpos)
{
 int x = curpos.x;
 int y = curpos.y;
 Chess[x][y] = 0;
}
void FootPrint(PosType pos)
{
 int x = pos.x;
 int y = pos.y;
 Chess[x][y] = curstep;
}
void InitChess()
{
  int i, j;
  for (i = 0; i < AddRow; i++)
  {
   for (j = 0; j < AddCol; j++)
   {
    if ((i < 2 || i>7) || (j < 2 || j>7))
     Chess[i][j] = -1;
    else
     Chess[i][j] = 0;
   }
  }
}
bool ChessBoard(PosType Start)
{
PosType curpos;
SqStack S;
InitStack(S);
SElemType e;
int counter = 0;
curpos.x = Start.x;
curpos.y = Start.y;
do
{
if (Pass(curpos))        //如果可以通过
{
FootPrint(curpos);
e.di = 1;
e.seat = curpos;
Push(S, e);
NextPos(curpos, 1);
curstep++;
if (curstep == 37)
{
counter++;
cout << "第" << counter << "个解" << endl;
ChessPrint();
Pop(S, e);e.di++;Push(S, e);
curpos = e.seat;
NextPos(curpos, e.di);
}
}else
{
if (!StackEmpty(S))
{
Pop(S, e);        
while (e.di == 8 && !StackEmpty(S)
{
curstep--;   
MarkPrint(e.seat);     
Pop(S, e);
curpos = e.seat;
}
if (e.di < 8){
e.di++;
Push(S, e);
curpos = e.seat;
NextPos(curpos, e.di);
}
}
}
} while (!StackEmpty(S));
cout << "求解结束" << endl;
return true;
}
int main()
{
    PosType Start;
    InitChess();
    Start.x = 2;
    Start.y = 2;
    ChessBoard(Start);
    return 0;
}


bool InitStack(SqStack& S)
{
    S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S.base)
    {
        cout << "申请空间失败" << endl;
        return false;
    }
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return true;
}
bool Push(SqStack& S, SElemType e)
{
if (S.top - S.base >= S.stacksize)
{
S.base = (SElemType*)realloc(S.base, sizeof(SElemType) * (S.stacksize * 2));
S.top = S.base + S.stacksize;
S.stacksize = S.stacksize * 2;
}
    *S.top = e;
    S.top++;
    return true;
}
bool Pop(SqStack& S, SElemType& e)
{
    if (S.top == S.base)
        return false;
    e = *--S.top;
    return true;
}
bool StackEmpty(SqStack S)
{
    if (S.base == S.top)
        return true;
    else
        return false;
}

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

马踏棋盘求----全部解 的相关文章

  • QT基础部件学习笔记

    目录 一 QT程序开发流程 二 QT基础部件分类 1 按钮类 普通 工具 单选 复选 命令连接 编辑 编辑 2 布局类 水平 垂直 网格 两列 该类的实例具体与其他类同时使用 编辑 3 输出类 标签 文本浏览器 日历 七段数码管 进度条 4
  • 反编译解析数组为什么可以使用foreach

    反编译解析数组为什么可以使用foreach 一 说明 二 集合使用foreach 三 数组使用foreach 四 数组使用for 五 javap反编译程序 5 1 TestCollection结果 5 2 TestArray结果 5 3 T
  • 阿里云mysql gtid_阿里云RDS mysql报错:Statement violates GTID consistency

    近日有用户反馈使用RDS mysql8 0时 在执行语句 create table select时报错了 主要错误是 Statement violates GTID consistency 字面理解是语句违反GTID一致性 报错截图 Sta
  • 图像增强 cnn

    目录 实时图像增强 基于 间距自适应查找表 的方法 CVPR 2022 Image Adaptive 3DLUT 水下图像增强UWCNN wtf 直方图均衡化 CycleGan增强 2个项目 实时图像增强 基于 间距自适应查找表 的方法 C
  • Qt基础:四、多窗口切换

    这是一个测试多窗口切换的程序 点击主界面上得按键 然后弹出一个新的对话框窗口 1 在主界面添加一个按键 2 实现按键的槽函数 void MyWidget on showChildButton clicked QDialog dialog n
  • 优化Java应用程序性能:解决高GC耗时问题

    优化Java应用程序性能 解决高GC耗时问题 在开发和维护Java应用程序时 我们经常遇到性能问题 其中之一是高GC 垃圾收集 耗时 垃圾收集是Java虚拟机 JVM 的一项重要任务 用于自动管理内存和释放不再使用的对象 然而 当GC耗时过
  • 【模型量化】

    文章认为量化会使网络激活值的均值发生偏移 通过对偏移进行修正 可以有效提高量化模型的性能 首先考虑 激活值的均值偏移 网络BN会统计出数据经过某层后的均值和方差信息 而网络在经过量化后 同样的数据经过该层后 其均值已经不符合原BN统计出的均
  • 测试基础 - 软件测试的分类

    1 测试性质 类型 定义和考虑点 确认测试 表明软件是可正常工作的 并且符合 软件需求说明书 中规定的全部功能和性能要求 鉴定测试 针对软件质量情况进行的一项专项测试 测试出具的权威鉴定测试报告 可作为软件质量判定的重要依据 验收测试 1
  • 操作系统调度策略

    操作系统调度是为了再有限的资源下 通过对多个程序执行过程的国立 尽可能满足系统和应用的 指标 如等待响应时间 完成时间 系统得资源利用率 吞吐量 功耗等 设计一个令用户满意的调度器绝非易事 主要有以下挑战 调度指标多样性 不同场景下的调度指
  • 2014年1月8日--1月15日(杂事太多,算10小时,剩4733小时)

    1月8日 上午开会 下午被授课 算1小时吧 1月9日 决定完成光线追踪算法 DEMO7 1和 DX11的TRIANGLE 并把挖掘机的改造定帧 以及SHADER接口
  • Python人脸识别

    OpenCV 简介 OpenCV 的全称是Open Source Computer Vision Library 是一个跨平台的计算机视觉库 OpenCV 是由英特尔公司发起并参与开发 以 BSD 许可证授权发行 可以在商业和研究领域中免费
  • USB-数据传输

    一 USB编码 反向不归零编码 NRZI 位填充 规则 数据为0 电平反转 数据为1 电平不翻转 当连续出现6个相同的1穿插一个0 目的是为了防止连续出现多个1导致的同步漂移 二 USB传输帧 帧是USB传输的时间单位 低速 全速设备固定为
  • innerHtml用法

    innerHtml用法 span span
  • mktemp命令的用法

    一 概述 Linux使用 tmp目录来存放不需要永久保留的文件 mktemp命令专门用来创建临时文件 并且其创建的临时文件是唯一的 shell会根据mktemp命令创建临时文件 但不会使用默认的umask值 管理权限的 它会将文件的读写权限
  • gps模块协议NMEA-0183的解析----android4.2下的gps hal层

    这些天调试了一款GPS模组 对GPS的数据格式协议NMEA 0183有了一些了解 现把这些天的心得体会记录下来 GPS 模块硬件介绍 国内的一款GPS模组 使用uart接口与主控进行通信 这款GPS模组只需要供电 使能就能够工作 不需要下载
  • 树莓派3B+安装Debian系统,并配置ssh登录

    Table of Contents 1 需要准备的材料 2 下载镜像文件 3 清除SD卡并烧写系统 4 打开ssh登录权限 5 查看树莓派的IP地址 6 通过putty登录树莓派 1 需要准备的材料 SD卡 树莓派 读卡器 网线 2 下载镜
  • CRM巨头败走中国,Salesforce中国区或将解散?

    关注ITValue 看企业级最新鲜 最价值报道 作者丨海阳 出品丨ToB行业头条 ID wwwqifu Salesforce或将退出中国市场 海外软件在华遭遇 水土不服 ITValue 8月3日 相关传言称 美国最大客户关系管理SaaS供应
  • Centos开启SSH服务

    本篇文章为转载 原作者文章地址 Centos7开启SSH服务 KinwingHU 博客园 cnblogs com 在虚拟机 Vmware Workstation 下 安装了CentOS7 现在想通过SSH工具连接虚拟机中的CentOS7 1
  • vue实现聊天框自动滚动

    需求 1 聊天数据实时更新渲染到页面 2 页面高度随聊天数据增加而增加 3 竖向滚动 4 当用户输入聊天内容或者接口返回聊天内容渲染在页面后 自动滚动到底部 5 提供点击事件操控滚动条上下翻动 环境依赖 vue vue cli 5 0 8
  • Java VisualVM无法更新或安装插件解决办法

    Java VisualVM是JDK中的一个工具 可以实时查看Java程序内存变化的情况 今天在更新或安装时有时会出现建立连接时的问题 提示找不到系统文件 出现这种问题是因为地址出现了问题 整了半天 发现是原来的地址已经发生了改变 解决方法

随机推荐

  • html5实现有道翻译文字播报语音,H5实现文字语音播报

    前言 搜了一堆百度 搜狗 有道的 没有一个能用的 只能投机取巧了 实现 获取播放路径 html
  • Python实现文件编码转换GB2312、GBK、UTF-8

    Python实现文件编码转换GB2312 GBK UTF 8 1 查看文件编码格式 import chardet filename flash c with open filename rb as f data f read encodin
  • [BugKu Web]ez_serialize

    本writeup已经在bugku开放 根据题意 显然是一道JAVA反序列化的题 关于JAVA反序列化漏洞的成因 参见博客https zhuanlan zhihu com p 422314689 此处只说明解题思路 重复开启场景已经没金币了
  • flex布局,子元素设置flex: 1和nowrap,内容长度超出盒子

    解决方法 子元素设置宽度即可 flex 1 width 0 或者 flex 1 min width 0
  • Springboot 项目启动出现 Mysql Lock wait timeout exceeded; try restarting transaction 错误

    一 查询 你的当前数据是否有 Sleep 的事务 执行 sql 检查 在你的项目停止或关闭后检查 show full PROCESSLIST 如果有执行 kill 杀掉 kill id kill 3009 二 查询是否存在挂起的锁 sele
  • pc虚拟服务器,基于虚拟服务器的分布式PC共享平台设计及实现

    摘要 随着云计算等技术的不断发展 C S架构的计算能力在慢慢地向服务器端倾斜 公有云 私有云等产品的出现 代表着人们访问应用程序时不再依赖于传统PC而是借助瘦客户机等连接网络的设备 本文旨在构建基于虚拟服务器的分布式PC共享平台 将桌面虚拟
  • 毕业设计-基于生成对抗网络的图像风格迁移

    目录 前言 课题背景和意义 实现技术思路 一 相关工作 二 基于生成对抗网络的风格迁移模型 三 实验与结果分析 四 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为
  • 计算机算法与程序设计 第一章 编程作业

    返回 所有测验 作业和考试都在2020年12月30日23点截止 请及时完成 编程作业题可以多次提交 取最高分作为本题成绩 依照学术诚信条款 我保证此作业是本人独立完成的 温馨提示 1 本次作业属于Online Judge题目 提交后由系统即
  • 解决Windows系统缺少comres.dll文件无法启动程序问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个comres
  • 类的静态成员变量初始化时间

    首先先搞明白 声明 定义 初始化 类的静态成员变量在类内声明 可以多次声明 类的静态成员必须在类外定义 定义就是给变量分配内存 初始化就是给一个变量赋初值 内置类型通常定义时默认初始化 类静态成员变量在main函数执行前完成初始化 有静态初
  • buck拓扑原理及仿真

    buck基本拓扑结构 开关管ON 电源向负载电阻提供电能 电感电流线性增大 变化率 变化量 开关管OFF 电感 电容中能量继续向负载电阻提供电能 电感电流线性减小 变化率 变化量 平衡状态时 由电感伏秒平衡得 推导得 理论电感电流在CCM
  • 快节奏多人在线游戏网络入门系列教程(2):客户端预测与服务器协调

    简介 在上一篇文章中 我们简单介绍了权威服务器的体系 客户端发送交互信息给服务器 服务器周期性的更新游戏状态 然后返回游戏状态给客户端 这个简单体系会导致用户发送命令时和屏幕渲染响应之间的延迟 产生延迟的原因是客户端发送命令给服务器 加上服
  • BIO/NIO/AIO

    IO模型 BIO BIO全称为 Blocking I O 是一种同步阻塞IO 最开始的网络通信就是BIO模型 服务端创建一个ServerSocket 客户端创建一个 Socket 去连接服务端 这样客户端与服务端便可以进行通信了 产生的问题
  • Mybatis中针对数据库日期JdbcType设置

    Mybatis中针对数据库日期JdbcType设置 在学习Mysql的时候 我们知道数据库类型有date datatime time类型 在用Mybatis进行插入数据的时候 我们实体一般都是直接指定java util Date类型 为了确
  • 机器学习中的相似性度量

    https www cnblogs com heaad archive 2011 03 08 1977733 html 1 欧氏距离 曼哈顿距离 切比雪夫距离 闵可夫斯基距离 标准化欧氏距离 马氏距离 夹角余弦 汉明距离 杰卡德距离 杰卡德
  • 菜鸟入门HTML

    标题HTML 一 1 单标签 一般单独完成某一功能的标签都为单标签 link 导入图片或css或其他资源 例 img src路径 插入一个图片到网页中 例 img src title 123 在这里插入图片描述 https img blog
  • 转:彻底搞定期货穿透式CTP API接入

    中信期货看穿式监管认证操作指南 CTP系统 https www citicsf com static download soft E4 B8 AD E4 BF A1 E6 9C 9F E8 B4 A7 E7 9C 8B E7 A9 BF E
  • NTSC和PAL制同步信号模拟输出

    NTSC和PAL制同步信号模拟输出 原由 由于我想输出一个NTSC制和PAL制的同步黑场 只需要输出同步信号 之后输出rgb信号给ADV 7123 后输出到显示屏 下面是我的心路历程和知识总结 一 了解NTSC和PAL PAL 电视标准 每
  • kinect2.0视角范围和距离远近

    本文章由cartzhang编写 转载请注明出处 所有权利保留 文章链接 http blog csdn net cartzhang article details 44588097 作者 cartzhang Kinect 摄像头范围介绍和玩家
  • 马踏棋盘求----全部解

    标题 运用栈和回溯法求马踏棋盘的全部解 回溯法的写法参考 数据结构 严蔚敏 的迷宫求解 感谢我的队友 汪汪汪 他与求一个解不同之处在于 当我们求到一个解之后 这个程序却会告诉计算机 啊 这不是我们想要的解 我们继续吧 于是 傻傻的计算机就信