9.3  马踏棋盘(1)

【题目要求】

国际象棋的棋盘为8*8的方格棋盘。现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动。要求每个方格只能进入一次,最终使得"马"走遍棋盘的64个方格。编写一个C程序,实现马踏棋盘操作,要求用1~64这64个数字标注马移动的路径,也就是按照求出的行走路线,将数字1,2,……64依次填入棋盘的方格中,并输出。

国际象棋中,"马"的移动规则如图9-4所示。

图9-4 "马"的移动规则

如图9-4所示,图中实心的圆圈代表"马"的位置,它下一步可移动到图中空心圆圈标注的8个位置上,该规则叫做"马走日"。但是如果"马"位于棋盘的边界附近,它下一步可移动到的位置就不一定有8个了,因为要保证"马"每一步都走在棋盘中。

【题目分析】

马踏棋盘的问题其实就是要将1,2,…,64填入到一个8*8的矩阵中,要求相邻的两个数按照"马"的移动规则放置在矩阵中。例如数字a放置在矩阵的(i,j)位置上,数字a+1只能放置在矩阵的(i-2,j+1),(i-1,j+2),(i+1,j+2),(i+2,j+1),(i+2,j-1),(i+1,j-2),(i-1,j-2),(i-2,j-1)之中的一个位置上。将矩阵填满并输出。这样在矩阵中从1,2…遍历到64,就得到了马踏棋盘的行走路线。因此本题的最终目的是输出一个8*8的矩阵,在该矩阵中填有1,2…64这64个数字,相邻数字之间遵照"马走日"的规则。

解决马踏棋盘问题的一种比较容易理解的方法是应用递归的深度优先搜索的思想。因为"马"每走一步都是盲目的,它并不能判断当前的走步一定正确,而只能保证当前这步是可走的。"马"走的每一步棋都是从它当前位置出发,向下一步的8个位置中的1个行走(在它下一步有8个位置可走的情况下)。因此"马"当前所走的路径并不一定正确,因为它可能还有剩下的可选路径没有尝试,如图9-5所示。

图9-5 "马"的可选路径

如图9-5所示,假设最开始"马"位于棋盘的(0,0)的位置,接下来"马"有两处位置可走,即(1,2)和(2,1)。这时"马"是无法确定走2的位置最终是正确的,还是走3的位置最终是正确的。因此"马"只能任意先从一个路径走下去(例如从2的位置)。如果这条路是正确的,那当然是幸运的,如果不正确,则"马"要退回到***步,继续从3的位置走下去。以后"马"走的每一步行走都遵循这个规则。这个过程就是一种深度搜索的过程,同时也是一种具有重复性操作的递归过程。可以用一棵"探索树"来描述该深度优先搜索过程,如图9-6所示。

图9-6  深度优先搜索过程

"马"的行走过程实际上就是一个深度探索的过程。如图9-6所示,"探索树"的根结点为"马"在棋盘中的初始位置(这里用4*4的棋盘示意)。接下来"马"有两种行走方式,于是根结点派生出两个分支。而再往下一步行走,根结点的两个孩子又能够分别派生出其他不同的"行走路线"分支,如此派生下去,就得到了"马"的所有可能的走步状态。可以想见,该探索树的叶子结点只可能有两种状态:一是该结点不能再派生出其他的"走步"分支了,也就是"马"走不通了;二是棋盘中的每个方格都被走到,即"马"踏遍棋盘。于是从该探索树的根结点到第二种情况的叶结点构成的路径就是马踏棋盘的行走过程。

如何才能通过搜索这棵探索树找到这条马踏棋盘的行走路径呢?可以采用深度优先搜索的方法以先序的方式访问树中的各个结点,直到访问到叶结点。如果叶结点是第二种情况的叶结点,则搜索过程可以结束,因为找到了马踏棋盘的行走路径;如果叶结点为***种情况的叶结点,即走不通了,则需要返回到上一层的结点,顺着该结点的下一条分支继续进行深度优先搜索下去。

因此在设计"马踏棋盘"的算法时可以借鉴前面讲过的图的深度优先遍历算法和二叉树的先序遍历算法。但是在这里并不需要真正地构建这样一棵探索树,我们只需要借用探索树的思想。在实际的操作过程中,所谓的探索树实际就是深度优先搜索的探索路径,每个结点实际就是当前的棋盘状态,而所谓的叶结点要么就是在当前棋盘状态下,"马"无法再进行下一步行走;要么就是马踏棋盘成功。该算法描述可如下:int TravelChess Board (int x,int y,int tag)

{

chess[x][y] = tag;

if(tag== 64)  { return 1;}

找到"马"的下一个行走坐标(x1,y1),如果找到返回flag=1,否则返回flag=0;

while(flag ){

if(TravelChessBoard (x1,y1,tag+1))return 1;

/*递归调用TravelChess ,

从x1,y1向下搜索;如果从

x1,y1往下马踏棋盘成功,返

回1*/

else

继续找到"马"的下一个行走坐标(x1,y1),

如果找到返回flag=1,否则返回flag=0;

}

if(flag== 0)

chess[x][y] = 0;

return 0;

}

【责任编辑:云霞 TEL:(010)68476606】

点赞 0

马踏棋盘python_9.3 马踏棋盘(1)相关推荐

  1. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  2. 马走日程序Java_马走日什么意思

    中国象棋在中国有着三千多年的历史,在中国古代,象棋被列为士大夫们的修身之艺,属于琴棋书画四艺之一.现在则被视为是怡神益智的一种有益身心的活动. 中国象棋是由两人轮流走子,以"将死" ...

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

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

  4. python棋盘覆盖_java实现的棋盘覆盖

    课课家和大家分享一些Java实现的棋盘覆盖的思路:应用分治法 分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题.k&g ...

  5. c语言 100匹马 编程,编程,百马百担有关问题,有100匹马,驮100担货,大马驮三担,中马驮2担,两匹小马驮一担,求大、中、小各多少匹...

    编程,百马百担问题,有100匹马,驮100担货,大马驮三担,中马驮2担,两匹小马驮一担,求大.中.小各多少匹? 编程,百马百担问题,有100匹马,驮100担货,大马驮三担,中马驮2担,两匹小马驮一担, ...

  6. 7.4 布朗运动-马氏性和强马氏性

    马氏性和强马氏性 1. 布朗运动的马氏性 1.1 扩展马氏性 1.2 Blumenthal's 0-1律 2 布朗路径的局部行为 2.1 局部行为 2.2 渐进行为和常返 3. 布朗运动的强马氏性 3 ...

  7. 不可复制的亚马逊:解码亚马逊商业模式

    不可复制的亚马逊:解码亚马逊商业模式 17年前,它是一家身家仅30万美元的网络书店;17年后,它成为一个囊括数字电影.家具.珠宝.3C数码.尿不湿等无所不包的电商王国,市值一度超过1000亿美元,是仅 ...

  8. 36匹马赛跑,跑道同时只能容许6匹马。而且36匹马速度不同,但是每次跑的速度恒定。 问跑多少次可以选出第一,第二,第三名?

     36匹马赛跑,跑道同时只能容许6匹马.而且36匹马速度不同,但是每次跑的速度恒定. 问跑多少次可以选出第一,第二,第三名?   分析:     36匹马分为6组(ABCDEF),比六次.     取 ...

  9. 什么是亚马逊测评?亚马逊测评又有什么作用呢?

    随着入驻亚马逊的卖家越来越多,亚马逊测评成为了新的衍生职业,什么是亚马逊测评?亚马逊测评后有什么作用呢? 什么是亚马逊测评 亚马逊测评就是卖家通过测评平台,联系到相应的买家,通过亚马逊这个平台,进行产 ...

  10. python棋盘覆盖问题,python实现棋盘覆盖问题及可视化

    问题介绍 棋盘覆盖问题,是一种编程问题. 如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆 ...

最新文章

  1. openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old
  2. vue 将字符串最后一个字符给替换_一步一步的实现Vue(一)
  3. 单机多节点有意义吗_十行代码让你的单机“影分身”,分布式训练速度快到飞起...
  4. 嵌入式linux root免密码,给嵌入式linux串口添加密码的一些总结
  5. 手工编程是指利用计算机完成,西安交通大学17年3月课程考试《CAD CAM》作业考核试题...
  6. Android Studio 使用教程(5)---打包apk
  7. 实战MongoDB-Replication之Master-Slave
  8. Openlayer:学习笔记之解析地图组成
  9. python中http_Python中的HTTP错误
  10. paip.提升用户体验---业务SQL注入漏洞的分析与解决
  11. 离线地图开发之标注柱状图特效(源代码)
  12. 2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的
  13. 四则运算生成程序(基于控制台)
  14. MYSQL常见命令-Java学习之数据库学习
  15. 最快的进制转换法之一,8421
  16. 计算机硬盘分区win7,win7如何磁盘分区 教您win7磁盘分区
  17. java_2017.9.18
  18. PDF分割与合并(充分利用Spire的bug实现操作PDF)
  19. docker volume用法
  20. 在家用电饼铛自制潮汕美食肠粉过程,想学的赶紧来看

热门文章

  1. [Android7.1][RK3399] 移远EC20添加4G通话功能-ql-ril.conf
  2. IE浏览器右键菜单分享扩展
  3. java nio oio_Java NIO 是 NIO么?
  4. 初入职场小白——CI/CD区分
  5. javaweb学生补助申请管理系统ssh
  6. Navicat 16建表教程
  7. dsp的前景怎么样?
  8. IMX6ULL裸机篇之SPI实验-SPI主控寄存器
  9. mysql垂直分表好处_水平|垂直拆表的好处
  10. 数据结构锐格实验三--实验四:二叉树的常见操作