2965 宽搜 + 剪纸 + 位操作
2011-03-20 11:53
127 查看
这到题和1753差不多,但是游戏的操作不一样了。每次操作是将相应位置的行列进行倒转,并且要求打印路径。
这到题卡了很多地方,一开始是位操作的时候,对同一个位置做了两次异或操作,导致那个位置的值没有改变。题目要求打印路径,这个不难,宽搜打印路径只要每个子节点记录其父亲就可以了。代码改得差不多之后,提交却一直超时,后来看了一下别人的代码,才知道这到题与1753不一样,得需要剪枝。我以为状态很少,最多只有65536个状态。但是我错在了对每一个状态,都生成他的16个儿子,然后去看其是否已经出现过,那这样就相当于65536*16的复杂度了。看了别人的剪枝,他是在父节点求子节点的时候,子节点的计算从父节点计算的位置的下一个位置开始。其实这个优化是很正确的。假如当前的节点操作是第2个位置,那么子节点就可以从第3个节点开始操作了,如果是从第一个节点开始,那么操作顺序就是2、1,但这个操作与1、2的结果是完全一样的,在求1的时候已经计算过这个可能了,这样就没有必要再重复计算。这样剪纸之后,复杂度就降低了好多好多,我也不懂表到了。
这到题卡了很多地方,一开始是位操作的时候,对同一个位置做了两次异或操作,导致那个位置的值没有改变。题目要求打印路径,这个不难,宽搜打印路径只要每个子节点记录其父亲就可以了。代码改得差不多之后,提交却一直超时,后来看了一下别人的代码,才知道这到题与1753不一样,得需要剪枝。我以为状态很少,最多只有65536个状态。但是我错在了对每一个状态,都生成他的16个儿子,然后去看其是否已经出现过,那这样就相当于65536*16的复杂度了。看了别人的剪枝,他是在父节点求子节点的时候,子节点的计算从父节点计算的位置的下一个位置开始。其实这个优化是很正确的。假如当前的节点操作是第2个位置,那么子节点就可以从第3个节点开始操作了,如果是从第一个节点开始,那么操作顺序就是2、1,但这个操作与1、2的结果是完全一样的,在求1的时候已经计算过这个可能了,这样就没有必要再重复计算。这样剪纸之后,复杂度就降低了好多好多,我也不懂表到了。
相关文章推荐
- 关于位操作的一些技巧小结
- [转自N神]Bitwise gems - fast integer math(AS3中的位操作)
- sql中的位操作
- Java中的位操作
- 位操作
- hdu 2965
- 位操作(Hacker's Delight)
- 用位操作解人员派遣问题
- POJ 2965 The Pilots Brothers' refrigerator 枚举
- 编程之美 中国象棋将帅问题 位操作
- 位操作
- POJ 2965 The Pilots Brothers' refrigerator【枚举】
- 熟悉C语言的位操作
- 位操作(Bitmanipulation)
- POJ2965
- poj 2965 The Pilots Brothers' refrigerator
- 位操作
- 常用的位操作:置位、清零与测试
- poj-2965
- LA_2965 Jurassic Remains