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

回溯法的写法参考《数据结构–严蔚敏》的迷宫求解
感谢我的队友-汪汪汪
他与求一个解不同之处在于,当我们求到一个解之后,这个程序却会告诉计算机:“啊!这不是我们想要的解,我们继续吧。”于是,傻傻的计算机就信了我们的话,跳过这个这个解,继续求下一个。当他走完所有可能之后,他才会退出循环,然后告诉我们,我已经求出全部解了。
下面是我求出的解,目前我已经求出三千多个解了,但是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;elsereturn 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;elseChess[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;elsereturn false;
}

马踏棋盘求----全部解相关推荐

  1. 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析

    马踏棋盘算法(骑士周游问题)的算法分析 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 马踏棋盘算法(骑士周游问题)的算法分析 一.C语言代码实现 二.代码分析与算法思路 题目要求 ...

  2. c语言字符马图案,C语言实现马踏棋盘

    //马踏棋盘主要要考虑三个因素: //第一:马走的位置用Move数组表示,以及棋盘的大小不再是8*8,而是12*12: //第二:只要找到马可以踏的下一个位置,就进行递归,只有一只进行递归,这是一种理 ...

  3. 骑士周游(马踏棋盘)问题

    1,马踏棋盘算法介绍 马踏棋盘问题也被称为骑士周游问题 将马随机放在国际象棋的8*8的棋盘中的某个格子里,马按照走棋规则(日子)进行移动.要求每个方格只进入一次,走遍64个方格 2,马踏棋盘算法思路分 ...

  4. 马踏棋盘的问题——贪心算法

    [贪心算法] 其实马踏棋盘的问题很早就有人提出,且早在1823年,J.C.Warnsdorff就提出了一个有名的算法. 在每个结点对其子结点进行选取时,优先选择 '出口'最小的进行搜索,'出口'的意思 ...

  5. 基于贪心算法的马踏棋盘哈密顿回路问题

    基于贪心算法的马踏棋盘哈密顿回路问题 Github 链接 问题分析 马踏棋盘其实相当于一个解空间的搜索问题,而遍历到每一个节点并要求最后可以回到起点本质上是一个哈密顿回路问题 目前大部分马踏棋盘的相关 ...

  6. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例

    本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...

  7. 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)

    题目描述  请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...

  8. 马踏棋盘问题的程序c语言,C语言马踏棋盘

    问题描述 国际象棋的棋盘为8×8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动.要求每个方格只能进入一次, ...

  9. 马踏棋盘问题(C++版)

    递归求解(回溯法求解),列出所有的解: 主要注意对各种参数的定义不要弄混,细心表达各种变量,可以在棋盘中设置墙壁,便于debug的检查与分析,并确定各种方向(dx[8]={1,1,-1,-1,2,2, ...

最新文章

  1. 青源LIVE第22期|旷视刘松涛:YOLOX,高性能目标检测的最新实践
  2. android java设置颜色_java – 设置背景颜色:Android
  3. c++ 中的 cin.get()函数
  4. h5常见问题汇总及解决方案
  5. jenkins 通过自动拉取Gitlab上的代码实现自动更新NGINX
  6. Spring管理的交易说明-第2部分(JPA)
  7. 飞畅科技-工业以太网交换机组网方式介绍
  8. MySQL数据同步的一个很初级运用
  9. informix数据库 java 增删改查
  10. 2D动作游戏开发与实现(翻译) .
  11. 51nod-1562:玻璃切割(O(n)模拟)
  12. Mac上编译Android8.0+
  13. Mac下安装Lingo
  14. python关系图谱_利用Python+Gephi构建LOL全英雄间的关联图谱
  15. Kindle PaperWhite 2越狱教程
  16. 希腊字母常用指代意义及其中英文读音
  17. python变量与声明
  18. C,数组声明、初始化,不初始化会如何?
  19. BAPI_COSTESTIMATE_DELETE、BAPI_COSTESTIMATE_DELETE_MULTI
  20. Unity基础(二)---立体声道

热门文章

  1. I2C协议和驱动框架分析(二)
  2. linux源码中ar8031驱动,AM335xd + KSZ8863RLL Linux网络底层驱动问题
  3. 思迈特软件Smartbi:掌控生产状况,报表开发效率提升30倍的秘密
  4. IDEA如何导入数据库
  5. mysql 默认插入值_MySQL插入默认字段值方法大全
  6. tsconfig.json在配置文件中找不到任何输入,怎么办?
  7. Android N和YunOS强势杀入车载OS市场,整车厂亟待加强软件能力!
  8. 斐波那契数列和青蛙跳台阶问题
  9. MVVM之OneTime,OneWay,TwoWay的区别和作用
  10. python pil怎么安装_python pil 怎么安装 怎样安装python的图像处理库pillow