HDU3220 逆向思维的 BFS
这道题有两个重要的地方,一个是对题目的理解,合法的操作只有一种,那就是对相邻的两个状态不同的灯泡进行交换状态的操作,也就是说,相邻的灯泡如果都是亮着的或者暗着的,那么不能对这条边进行操作。
第二点,那就是由于所有的状态的目标状态都是一样的,那么我们就可以从目标状态进行 BFS,计算出其他状态到目标状态要多少步,注意当 BFS 的步数大于 的时候,就不要将其子状态放入队列中,为了方便,之前将全部的状态的需要步数设置为 5,这样即使没有访问的状态,步数也是大于 的,这个算法的时间复杂度是 ,完全可以接受,之后就是 的查询。
为了方便 BFS,优化空间,运用位压缩,将 个灯泡的状态用一个 int 来存放,高位存放低编号的灯泡,装换的时候就用异或运算即可。
数组 和 用来对应 对相邻的灯泡