- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序设计与问题求解
——马踏棋盘(贪心法)
马踏棋盘问题
国际象棋棋盘是8*8的方格 ,现将 “马”放在任意指定的方格中 ,按照走棋规
则移动该棋子。要求每个方格只能进入一次 ,最终走遍棋盘64个方格
棋盘可用一个矩阵表示 ,当 “马”位于棋盘上某一位置时 ,它就有一个唯一的
坐标。根据规则 ,如果当前坐标是(x,y) ,那么它的下一跳可能有8个位置 ,分
别是(x+2,y-1)、(x+2,y+1)、(x+1,y+2)、(x-1,y+2)、(x-2,y+1)、(x-2,y-1)、
(x-1,y-2)、(x+1,y-2) 。当然坐标不能越界
x
y
马踏棋盘问题
马最初的位置标为1 ,它的下一跳的位置标为2 ,再下一跳的位置标为3 ,
依次类推 ,如果马走完棋盘 ,那么最后在棋盘上标的位置是64
要求编程解决马踏棋盘问题 ,最后输出一个8*8的矩阵 ,并用数字1-64
来标注 “马”的移动
马踏棋盘问题
基本解法:深度优先搜索
从某位置出发,先试探下一个可能位置;进入一个新位置后就从该位置进一
步试探下一位置,若遇到不可行位置则回退一步,然后再试探其他可能位置
马踏棋盘——深度优先搜索求解
可以用8*8数组 chess[][] 存储棋子周游状态,未走过位置赋0 ,走过的位置
依次为1、2、3、……。设(x,y)为当前位置,j 为当前走到第几步
// 深度优先搜索求解核心代码
bool Dfs(int chess[][8], int x, int y, int j)
{
chess[x][y] = j; //将新的一步标注到矩阵中
if (j == 64) return true; //成功!依次回退结束程序
计算下一可能位置(nextX, nextY); //不考虑是否可行
while ( (nextX, nextY)位置是否可行 ) {
if (Dfs(chess, nextX, nextY, j+1)) //递归调用,将进入新位置
return true;
计算下一可能位置(nextX, nextY);
}
chess[x][y] = 0; //这一步不可走,回退
return false;
}
马踏棋盘——深度优先搜索
深度优先搜索求解,相当于在类似下面的树中查询
位置(x, y)
下一步
L 1 L2 … L8
再下一 a1 … a4 b1 … b3 c1 … c5
步
… … … … … …
至此已不满
足约束条件
马踏棋盘——深度优先搜索 + 贪心法优化
从(x,y)开始,深度优先搜索会依次查询L1、L2、……、L8一共8个可能位置
如何加入贪心策略?
位置(x, y) 先试探哪一个位置,
?
? ? 更可能得到答案呢 ?
下一步
L 1 L2 … L8
再下一 a1 … a4 b1 … b3 c1 … c5
步
文档评论(0)