搜索策略

2012.10

例题. RQNOJ   幻方

给定N*N个数,把它们填入N*N的方格中,使每行每列和两个斜对角线里数的和都相等

对于30%的测试数据:N<=3

存在20%的测试数据:互不相同的数最多9个

对于100%的测试数据:N<=4,所有出现的数值的绝对值<=10^9

如果有多组解,将他们按照如下方法排序: 如果两组解第一行第一个数一样,那么就去比较第一行的第二个数,否则第一行第一个数较 小的一方更小。如果还是一样,就去比较第一行的第三个数...如果第一行全部一样,就去比 较第二行.....最后比较第N行的第N个数。 在这种排序方式下,输出最小的一组解

Solution1:按常规的搜索顺序,一行一行一列一列枚举+若干剪枝,然后最后一行可以直接算出来

这样思路比较简单,显然也能很容易地求出字典序最小的解,但是N=4过不去

那么怎么办呢?

首先回顾一下WCX写的《Dancing Links》

Donald Knuth将这一类问题总结为Algorithm X,并提出了一个十分有效的优化方法——Dancing Links。我对其的理解是在尽量靠近递归树根的位置减少问题的规模。

我们假设有两种空位总数相同而分布不同的情况:

1.空位置数量随着行增加而增加

2.空位数量随着行增加而减少

看上去此二者复杂度相同,其实不然。前者回溯时避免了后面更多数据的判断,从而加速了算法。为此,我们可以将行按空位置递增排序,并在函数中手动指定搜索顺序。

 

然后再看一下USACO上的一个题:Prime3

题目要求计算出一个每行、每列、两个斜对角线上的数都能组成素数的5*5矩阵。

考虑Dancing Links的思想:每一次枚举都要尽可能多地为后面的枚举制造约束条件

对于一个矩阵来说,那就是两条对角线!它可以控制尽可能多的行和列。

那么我们的枚举顺序就是:

先枚举两条对角线,因为他们控制的行列是最多的,而且左上角的数已经确定了。接着枚举中间的一竖列,因为它同样控制的行列最多,接着枚举最上面一行和最下面一行。此时第3行的2,4两个数也可以通过减法得到了。最后枚举第2,4行,第3行减法得到。于是所有格子都已经确定了,验证一下就OK

 

那么对于幻方这道题,我们不妨采用相同的思路:

枚举两条对角线,N<=3时可以直接计算出剩余的空格,判断并输出

N>=4时可以再枚举一些点

拓展:如果N=5呢?

枚举完对角线之后是这种情况:

然后我们可以枚举第3行和第3列。(同Prime3)

采用这样的搜索方法后,如何保证字典序最小?

因为搜索顺序发生了变化,所以只能搜出所有的解,再排序

但WCX曰:”可行解较少,所以速度不会太慢。”

程序实现方法:

拓展阅读:NOI专刊 2009.5  P31

首先我们需要定下搜索顺序,以及那些点需要枚举、那些点可以计算出。

比如Prime3可以设计如下搜索顺序

蓝色是需要枚举的点,橙色是计算的点

绿色为定点,不需操作

我们可以f[I,j].x、f[I,j].y,表示[I,j]点之后下一个要枚举的点为[i+f[I,j].x,j+f[I,j].y]

并且设cal[I,j]表示[I,j]点是枚举还是计算:

然后从第一个点开始按顺序dfs,如果当前点需要枚举就枚举,需要计算就计算。

所有的点都确定之后再进行相应的判断(有时甚至已经不用判断了,搜索+计算出来的已经是可行解)

另外在判断的时候可以进行优化:因为搜索过程中有些点是算出来的,所以有一些行\列\对角线已经是可行的了(对于”幻方”这道题),那么我们可以设数组h[i]=true\false,记录第i行是否还需要检查。列\对角线同理

总结:

遇到这种枚举类问题,应该让先开始的枚举能够尽可能多的约束后面的行为,并且能先计算出的点一定先计算出来。

比如上面的问题,如果按顺序枚举行和列,可以说,当前枚举的某一行对后面的行丝毫没有约束作用。可是枚举对角线呢?情况就大不相同了。

时间: 2024-08-12 14:01:58

搜索策略的相关文章

分库分表之后的搜索策略

所谓分库,就是把原来在一个库中的数据放到多个库中存储: 分表就是把原来在一个表中的数据放到多个表中存储. 这里不讨论分库分表的策略和具体实现,主要想记录的一点,就是分库分表后的搜索如何实现? 工作中遇到的是通过将库.表中的数据抽取出来,可用的工具有Solr.ElasticSearch等, 对你想要查询的字段建立索引,形成搜索库,这个搜索库和原来对表的搜索差不多,不同的是,搜索这个库并不是为了获取记录的完整数据. 完整的记录数据是通过查询条件在搜索库中找到满足条件的记录的id,然后通过获取的id再

win7平台批处理方式修改windows驱动程序安装搜索策略

在win7电脑上系统会默认首选通过windowsupdate搜索安装驱动程序,这是个漫长的过程. 可以通过两种方式修改. Windows+R键输入gpedit.msc,在组策略配置框中选择计算机配置--->管理模板--->系统--->设备安装 然后修改"指定设备驱动程序源位置的搜索顺序",选择启用,并配置为"不搜索windows update" 批处理方式直接修改注册表 reg add HKEY_LOCAL_MACHINE\SOFTWARE\Pol

飘逸的python - __get__ vs __getattr__ vs __getattribute__以及属性的搜索策略

差别: __getattribute__:是无条件被调用.对不论什么对象的属性訪问时,都会隐式的调用__getattribute__方法,比方调用t.__dict__,事实上运行了t.__getattribute__("__dict__")函数.所以假设我们在重载__getattribute__中又调用__dict__的话,会无限递归,用object大神来避免,即object.__getattribute__(self, name). __getattr__:仅仅有__getattri

python中__get__ vs __getattr__ vs __getattribute__以及属性的搜索策略

其中,__getattribute__是无条件被调用. 对任何对象的属性访问时,都会隐式的调用__getattribute__方法,比如调用t.__dict__,其实执行了t.__getattribute__("__dict__")函数.所以如果我们在重载__getattribute__中又调用__dict__的话,会无限递归,用object大神来避免,即object.__getattribute__(self, name). 只有__getattribute__找不到的时候,才会调用

算法分析与设计入门-搜索策略

来源于:网易云课堂-哈工大-王宏志老师 1.暴力美学 问题1.布尔表达式的可满足性问题(NP完全问题)  解1.时间复杂度是2^n. 问题2.8迷问题 解2.转换为树搜索问题,对可能的移动结果生成解空间 问题3.哈密顿环问题(NP完全问题) 解3.从原点出发,对可能访问到的点生成解空间,并且从每个可以访问到的点出发,若一个点的出发的所有边已经被访问过,那么就结束当前的点.如果所有的点的都不能走,就没有哈密顿环. 原文地址:https://www.cnblogs.com/BlueBlueSea/p

五大常用算法

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)-- 任何一个可以用计

了解搜索引擎来进行SEO

搜索引擎的工作的过程非常复杂,而简单的讲搜索引擎的工过程大体可以分成三个阶段.爬行和抓取:搜索引擎蜘蛛通过跟踪链接访问页面,获取页面HTML代码存入数据库.预处理:搜索赢球对抓取来的页面数据文字进行文字提取.中文分词.索引等处理,以备排名程序调用.排名:用户输入关键字后,排名调用索引库数据,计算相关性,然后按一定格式生成搜索结果页面. 爬行和抓取 爬行和抓取是搜索引擎工作的第一步,完成数据收集任务. 蜘蛛 搜索引擎用来爬行和访问页面的程序被称为蜘蛛(spider),也称为机器人(bot). 蜘蛛

CodeForces 478E Wavy numbers

题意: 如果一个数它的每一位(除了最高最低位)都大于或小于它两边的数字  则这个数字叫波浪数  输入n和k (10^14)  求%n==0的第k小的波浪数  如果没有或者大于10^14就输出-1 思路: 这也算是一种分治的搜索策略吧  meet-in-mid 由于数字最多14位  因此可以暴力高7位和低7位(均为80+w种)  然后枚举高位和低位去拼 这题对于代码书写要求较高!!  我的方法如下: 暴力高7位 暴力低7为  放进vector  同时记录对于一个number  它的首位  和  首

MongoDB---前世今生

MongoDB的官方文档基本是how to do的介绍,而关于how it worked却少之又少,本人也刚买了<MongoDB TheDefinitive Guide>的影印版,还没来得及看,本文原作者将其书中一些关于MongoDB内部现实方面的一些知识介绍如下,值得一看. 今天下载了<MongoDB The Definitive Guide>电子版,浏览了里面的内容,还是挺丰富的.是官网文档实际应用方面的一个补充.和官方文档类似,介绍MongoDB的内部原理是少之又少,只有在附