acm位运算应用搜索.doc_第1页
acm位运算应用搜索.doc_第2页
acm位运算应用搜索.doc_第3页
acm位运算应用搜索.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

acm位运算应用 搜索搜索此处不讲题目,只讲位运算是怎样在这些题中实现和应用的。由于搜索题往往是基于对状态的操作,位运算往往特别有效,优化之后的效果可以有目共睹。例1、POJ 1324根据题目,确定了对状态的表示之后(记录当前状态的蛇头x, y值与剩下部分的运动状态),一般容易想到剩下部分的运动状态用一个数组(比如xn-1, n为蛇节点数,n0为第二个节点的运动趋势)去表示,且一个数组元素的值为0,1,2,3,即四个方向,蛇每次移动,这个方向数组需要更新一次,更新是很简单的,除了n0更新之外,剩下的 n等于上一轮的ni-1(i1);如果用数组,就必须用一个循环去更新它,这样会导致程序速度不是很理想,所以可以想到用位运算去模拟,简言之,就是把原来的一个数组压缩的一个变量上去存储,原来任何一个数组元素的值范围03, 用二进制表示就是 00 11,最多占用2位,这样,我们就可以通过移位运算,和或运算去实现所以操作。基本技巧: 如果给你个一个方向序列 a0, a1, a2, a3, . a(n-1),放到变量b中,且以最低位表示an,可以用如下循环b = 0;for(i=0; in; i+) b = (b 的办法for(i=0; i (i*2) & 3; 移位会将低位元素除掉,而 & 3则是把移到低位的元素取出。更高效的方法是(两种方法的前提都是不改变b的值)t = b;for(i=0; i= 2;高效的原因如帖子开头所述。在表示状态的位段操作中,最好将变量设为unsigned int (short)型,因为有符号型(负数的最高位(符号位)为1)的 操作加在负数上时会在右边引入1而不是0, 这基本上不会是你想要的操作。例2、POJ 3460 Booksort这题可以在对书进行交换的时候应用位运算,也许你认为用数组去模拟更为直观,但是看看下面的实现,也许你就不那么认为了。书最大编号15,这样就开一个64位整形,每4位表示一本书首先预处理,计算出两张表extractj 和 clearj分别表示把书架上第i到j本书取出或清空,显然在i到j一段,位上全是1,而其他部分是0,而clearj就是extractj的取反计算方法如下:typedef unsigned long long longint;const longint base = 15;/这是必须注意的,普通的常数15是整形,在以下的操作中会越界for (i = 0; i 15; i+) extract = base (i * 4); clear = extract; for (j = i + 1; j 15; j+) extractj = extractj-1 | (base (j * 4); clearj = extractj; 计算出这些以后,交换书就变得异常简单inline void transposition(longint &cur, longint &next, int &i, int &k, int &j) /i,k段与k+1,c段置换next = cur & clearj;next |= (cur & extractk) (j - k) (k - i + 1) 2);先把i到j全部清空后的值赋给next,把 i, k段的书取出,移到高位(差值为(j - k) * 4),同理,再把k+i到j段的值取出移到低位。如此清楚明了,而如果用数组的话,10+行的语句是少不了的,而且容易搞错。例3:HOJ 八数码问题:8080/online/?action=problem&type=show&id=10466这题用位运算我倒是没有达到更快,空间稍微节省了些。另外,这题的测试数据很强的说,赞一个。用64位的整形去表示整个状态,其中每4位表示一个数码(08),如果是用char数组,则用9个,用了72位。取出某一位和清空某一位的掩码事先要计算好这样做比用一个整形数如 123480567 之类的去表示更有优势,因为显然取出某一位的速度非常快,不需要 % 10, /10之类耗时的操作,如果这样实现的话就不要用stl的map了,我无聊地试了次,相当之慢。还是老老实实康托展开的好。不过和开char数组的速度差不多的说(虽然说赋值时间大了,但毕竟别人是数组,呵呵,要是有每4位做一个单位的数组就好了不要跟我说用struct里面定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论