位运算状态压缩

位运算状态压缩:


用法:有几把钥匙就用几个二进制位来表示,对于每一把钥匙如果手里有就用1来表示,没有就用0表示。比如题中一共有4把钥匙,现在我们手里有1、3把钥匙,于是现在的钥匙状态就是1010。


1、判断是否有第n把钥匙

假如现在钥匙状态是1101,询问是否有第2把钥匙。

做法:首先1<<2,变成0100,即查询第二把钥匙。然后与1101进行与运算,结果为0100。如果这个结果值为0,说明没有这把钥匙,如果不为0,说明有。


2、判断现有钥匙是否能开锁

假如现在钥匙有三把,为1101,要开两把锁,为1001。

做法:1101与1001进行与运算,如果等于锁,则可以把锁全部打开。


3、加入钥匙

做法:先左移,再与原钥匙状态进行或运算。比如原来钥匙已有1001,加入第3把钥匙,就用1001和1<<1(即0010)进行或运算。用或运算而不是在原来的状态上直接加的原因是:可能之前已经有这把钥匙了,若现在又拾取这把钥匙,则状态不应该发生变化。


你可能感兴趣的:(acm/算法)