[较好深搜课件]搜索与回溯.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[较好深搜课件]搜索与回溯

一个最简单的想法: 我们可以从左上角到右下角枚举每一个未填上的格子,再枚举它可以放哪些数字,将它填上后继续搜索。当所有格子都填上后,计算一下总分,如果总分大于当前最优值就更新最优值 这样大约可以得35分 我们还可以对上面的想法进行改进: 我们可以先计算出每个格子的选择数 先确定可选择数小的格子 即先把只有一种选择的格子确定下来 再确定有两种选择的格子 …… 从而避免搜索到过多无法得到可行方案的状态 这样大约可以得75分 对于这道题,由于数据的原因,如果从右下角到左上角枚举,可以得到90分左右。 如果再加上一个叫做卡步的东西,我们可以得到100分。 什么是卡步? 我们发现搜到一个可行的方案是很快的,时间主要用于更新最优解。卡步就是当执行的步数到达一定值时,若程序还没有结束,那么我们就直接输出搜到的最优解,并退出。这个值很有可能不是最优的,但若继续搜索下去必然会超时,所以我们直接退出。这是在比赛中常用的技巧。 如何卡步? 最简单的办法就是在过程dfs中加入 inc(p);if p… then begin writeln(ans);halt; end; 本题可以用搜索+卡步得到100分,很重要的原因是这道题测试数据的特殊性。 如果要使程序能通过任何数据,可以采用位运算加速搜索和Dancing-links,但这两种方法在联赛范围内基本不会出现,我们不进行深入讨论。 另外还用一种方法可以得到100分:根据当前状态确定每个格子的选择数 我们之前有一个想法是按选择数从少到多搜索,但当我们确定下一个格子的数字后,会影响其它格子的选择,使它们的选择数减少。所以我们可以在搜索的时候计算格子的选择数,从当前选择数最少的格子开始搜索。 program sudoku; const z:array [1..9,1..9] of longint=((1,1,1,2,2,2,3,3,3), (1,1,1,2,2,2,3,3,3), (1,1,1,2,2,2,3,3,3), (4,4,4,5,5,5,6,6,6), (4,4,4,5,5,5,6,6,6), (4,4,4,5,5,5,6,6,6), (7,7,7,8,8,8,9,9,9), (7,7,7,8,8,8,9,9,9), (7,7,7,8,8,8,9,9,9)); fenshu:array [1..9,1..9] of longint=((6,6,6,6,6,6,6,6,6), (6,7,7,7,7,7,7,7,6), (6,7,8,8,8,8,8,7,6), (6,7,8,9,9,9,8,7,6), (6,7,8,9,10,9,8,7,6), (6,7,8,9,9,9,8,7,6), (6,7,8,8,8,8,8,7,6), (6,7,7,7,7,7,7,7,6), (6,6,6,6,6,6,6,6,6)); var i,j,ans,t:longint; map:array [0..9,0..9] of longint; hang,lie,ge:array [1..9,1..9] of boolean; x,y:array [0..81] of longint; c:array [0..81] of bool

文档评论(0)

laolingdao1a + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档