千家信息网

怎么用C++代码实现马踏棋盘

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要讲解了"怎么用C++代码实现马踏棋盘",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用C++代码实现马踏棋盘"吧!(一)马踏棋盘经典算法
千家信息网最后更新 2025年01月20日怎么用C++代码实现马踏棋盘

这篇文章主要讲解了"怎么用C++代码实现马踏棋盘",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用C++代码实现马踏棋盘"吧!

(一)马踏棋盘经典算法描述:

(1)马踏棋盘是经典的程序设计问题之一,主要的解决方案有两种:一种是基于深度优先搜索的方法,另一种是基于贪婪算法的方法。第一种基于深度优先搜索的方法是比较常用的算法,深度优先搜索算法也是数据结构中的经典算法之一,主要是采用递归的思想,一级一级的寻找,遍历出所有的结果,最后找到合适的解。而基于贪婪的算法则是制定贪心准则,一旦设定不能修改,他只关心局部最优解,但不一定能得到最优解。

【问题描述】关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘。现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动。要求每个方格只能进入一次,最终使得"马"走遍棋盘的64个方格。

【算法分析】

① 在四角,马踏日走只有两个选择;

② 在其余部分,马踏日走有四、六、八不等的选择。

解决方案:在外层另外加上两层,确保 8*8 方格中的每一个格子都有8中不同的选择;

重点:为了确保每个格子能走日字,而且选择的可能性等同,初始化除了最外两层格子标记没有被访问,最外两层中每个格子都标记为已被访问即可达到目标!

解释:图片中标记红色的区域,初始化时就默认为马已踏日字,集已被访问,而中间的 8*8 的表格标记为马未被访问!

并且每一个表格中马在访问时都有8中不同的选择,这8中不同的选择都会在其相应的x和y坐标上进行追加标记;

这8中选择方式为:

【代码展示1】:递归求解(回溯法求解),列出所有的解,并从中找出从(2,2)位置出发的合适解:

#include #include  using namespace std; int chessboard[12][12] = {0}; int cnt = 0;            //标记马已走的方格数int sum = 0;            //标记马走完全程的具体方案数int move[8][2]={ {2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};    //初始马当前位置向其周围相邻八个日字的 x,y的偏移量 //输出马踏棋盘的解 void PrintChess();//马踏棋盘递归过程void Horse(int x,int y);  int main(void){    int i,j;    for(i=0;i<12;i++){        for(j=0;j<12;j++){            if(i==0 || i==1 || i==10 || i==11 || j==0 || j==1 || j==10 || j==11){                chessboard[i][j]=-1;//在 8 * 8 的外层再加上两层,确保 8 * 8 方格中的每一个格子都有 8 种不同的日字选择             }        }    }    //从起始位置开始求得所有解    chessboard[2][2] = ++cnt;    Horse(2,2);    //递归调用当前当前位置附近的 8 个日字,看看是否满足条件    return 0; }  void Horse(int x,int y){        //马永远踏的是 x,y位置,而不是 a,b     if(cnt >= 64){        //临界值,马走日字全部踏完,成功求出问题解             sum++;        PrintChess();        return;    }     for(int i=0;i<8;i++){        int a = x + move[i][0];        //拿到当前马位置相邻的 8 个日字的 x 坐标         int b = y + move[i][1];        //拿到当前马位置相邻的 8 个日字的 y 坐标         if(chessboard[a][b] == 0){    //判断当前马位置相邻的日字是否已被访问             cnt++;                                 chessboard[a][b]=cnt;    //标志已被访问            Horse(a,b);                 //从当前马的位置继续往下访问            cnt--;                                chessboard[a][b]=0;     //回溯回来修改其相邻的日字的访问情况         }    }} //输出马踏棋盘的解 void PrintChess(){    cout<

【问题的解】:只列出量两组解,其余未列出:

【代码展示2】:贪心算法求解,列出从(2,2)位置出发的合适解,局部最优:

#include #include  using namespace std; /* typedef struct{    int x;            //记录当前马位置的 x 坐标            int y;            //记录当前马位置的 y 坐标     int i;            //记录从当前马的位置前往下一个日字的序号 i (0

【问题的解】:列出一组解:

感谢各位的阅读,以上就是"怎么用C++代码实现马踏棋盘"的内容了,经过本文的学习后,相信大家对怎么用C++代码实现马踏棋盘这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

位置 棋盘 标记 坐标 方格 算法 选择 代码 问题 递归 C++ 序号 格子 过程 搜索 输出 不同 合适 代表 方案 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天龙八部私服哪里买服务器 福州哪里学软件开发 山东爱拓软件开发有限公司 湖南工业职业技术学院软件开发 南充软件开发培训机构 虚拟货币用什么软件开发 安徽泰格网络技术有限公司 网络游戏软件开发大数据 计算机网络技术与应用自考题 网络安全法规定 个人发 原服务器没有了怎么回去 去哪里找软件开发人才 服务器对外开放域名解读 5g网络技术思路 电子资源数据库培训心得体会 网络安全收购黑莓 怀柔区信息网络技术推广口碑推荐 计算机网络技术专业认知分析 传奇手游软件开发公司 清溪网络安全监察部门电话 网银和服务器不兼容 网络安全法 权利 协议软件开发部是干嘛的 宁夏果蔬配送软件开发 我讲网络安全普法知识 软件开发公司女生 湖州软件开发驻场大概多少钱 数据分析图形化操作数据库 网络安全证书导入 数据库按一定的数据结构
0