马踏棋盘问题(C++版)
递归求解(回溯法求解),列出所有的解:
主要注意对各种参数的定义不要弄混,细心表达各种变量,可以在棋盘中设置墙壁,便于debug的检查与分析,并确定各种方向(dx[8]={1,1,-1,-1,2,2,-2,-2},dy[8]={2,-2,2,-2,1,-1,1,-1};),一步步探索可行解,最后说明一点:写代码时一定要力求代码的高效性与可读性,不可将能运行作为最终目的。
以下主要构造了栈进行操作,本题可以作为一个深度了解并熟悉栈性质的题目实战。
运行代码如下:
using namespace std;
#include <iostream>
#include <iomanip>
const int StackInitSize = 30;
const int StackInc = 10;typedef struct position
{int x, y;
}SElemType;struct Maze
{int m, n;int b[9][9]={0};position start;
};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 DelTop(SStack &S)
{if(S.top==S.base){return false;}S.top--;return true;
}bool Pop(SStack &S,SElemType &e)
{if(S.top==S.base){return false;}S.top--;e=*S.top;return true;
}bool GetTop(SStack S,SElemType& e)
{if(S.top==S.base){return false;}e = *(S.top - 1);return true;
}void MazeInit(Maze &M,int m,int n)
{M.m=m;M.n=n;
}bool MazePath(Maze &M)
{const int dx[8]={1,1,-1,-1,2,2,-2,-2},dy[8]={2,-2,2,-2,1,-1,1,-1};int i,j,d,k;for(i=1;i<=M.m;i++){for(j=1;j<=M.n;i++){M.b[i][j]=0;}}position P,Q;bool pass,succ;SStack S;StackInit(S);MazeInit(M,5,5);M.start.x = 1; M.start.y = 1;Push(S,M.start);k=1;succ=false;while(GetTop(S,P)){pass=false;for(d=M.b[P.x][P.y]+1;d<=8;d++){Q.x = P.x+dx[d-1];Q.y = P.y+dy[d-1];if (Q.x >= 1 && Q.y>=1 && Q.x<=M.m && Q.y<= M.n && M.b[Q.x][Q.y]==0){pass=true;break;}}M.b[P.x][P.y]=d;if(pass){Push(S,Q);k++;if(k==M.m*M.n){succ=true;break;};}else{M.b[P.x][P.y]=0;DelTop(S);k--;}}if(!succ) return false;while (Pop(S,P)) M.b[P.x][P.y]=k--;return true;
}void shuchu(Maze M)
{for (int i = 1; i <= M.m ; i++){for (int j = 1; j <= M.n ; j++){cout<<setw(5)<<M.b[i][j];}cout << endl;}
}int main()
{Maze M;MazePath(M);shuchu(M);return 0;
}
马踏棋盘运行结果如下:
同样地,也可以根据其性质,改造成合适长宽的象踏棋盘,但万变不离其宗,原理均一致,弄懂了即可以不变应万变。
马踏棋盘问题(C++版)相关推荐
- 马踏棋盘(Java版)
问题: 国际象棋的棋盘为8*8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动.要求每个方格只能进入一次,最 ...
- 用贪心算法解决马踏棋盘问题
用贪心算法解决马踏棋盘问题 参考文章: (1)用贪心算法解决马踏棋盘问题 (2)https://www.cnblogs.com/Allen-win/p/7095293.html 备忘一下.
- 数据结构——马踏棋盘题解(贪心算法)
本文转自: https://blog.csdn.net/qq_41596568/article/details/83060317 数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值 ...
- 残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...
马踏棋盘算法介绍和游戏演示 1.马踏棋盘算法也被称为骑士周游问题 2.将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一 ...
- java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...
前言需求 今天我们学习的是马踏棋盘算法,我们还是从一个场景里引入看看 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的6×6棋盘Board0-5的某个方格中 提示:马按走棋规则(马走日字)进行 ...
- 马踏棋盘算法(骑士周游问题)
要求: 国家棋盘为8*8的方格棋盘,将"马"放在任意指定方格中.最终让马走遍64个方格. 关于象棋中马的走法 如下图所示: 下面是代码: #include <stdio.h& ...
- python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...
- 【算法】马踏棋盘算法 骑士走周游算法
文章目录 1.概述 2.贪心优化 1.概述 马踏棋盘算法和八皇后问题很相似:[算法]八皇后问题 骑士周游问题的解决步骤和思路 创建棋盘chessBoard,是一个二维数组 将当前位置设置为已经访问,然 ...
- 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...
最新文章
- 堆排序——HeapSort
- 2011年1月和2月blog汇总:Orchard、敏捷个人、英语
- 拷贝构造函数的参数类型必须是引用
- mysql myisam转innodb_Mysql MyISAM数据库批量转换表引擎为Innodb
- 企业IM优劣势对比调查 各有特点
- Fvwm-背景图片设置三法
- 构建全程电子商务,创新企业经营模式(2)
- 毕业一年,疫情之下的95后工作:有的退而求次,有的忐忑前行
- MySQL 创建索引
- css绘画三角形,实现一些图形
- 【NOIP2012】【Luogu1075】质因数分解(模拟)
- opencv常用函数整理(一)
- ACM HDU 2516 取石子游戏(博弈)
- java接口测试工具_接口模拟测试利器,moco server工具的介绍
- like语法 mysql_mysql中like语法拼接4种方式
- 西门子S7-200SMART PLC视频教程(百度网盘)
- Java实验输出希腊字母表
- 这几天阅读的shadowgun的几个shader
- PDF怎么打印?为什么有时选择打印没有反应?
- B-spline算法(B样条曲线)