672. Bulb Switcher II

这道题看上去很吓人。
但是观察发现由于操作时总是几个灯泡一起操作,所以必然有不少灯泡的状态是锁定的。
最多只有6个状态独立的灯泡。
所以n可以转换成min(n, 6)
然后对于同一个操作, 执行 0次和2次效果是一样的, 执行1次和3次效果是一样的。
而且不同操作之间是可以互换的。
所以他们是相互独立的而且没有先后顺序的。
有四种操作,每种操作执行0次或者一次。
我们可以用bfs从0出发看 一共有多少种状态。最后会遇到一个循环。这样处理有点麻烦。

但最多有16种状态,索性我们就看每种状态哪种状态在m步里可以到吧
只要奇偶数match,和需要set为1的位数大于等于m这个状态就可以到 。

class Solution {
    public int flipLights(int n, int m) {
        n = Math.min(6, n);
        Set<Integer> seen = new HashSet<>();
        int shift = 6 - n;
        for (int cand = 0; cand < 16; ++cand) {
            int bCount = Integer.bitCount(cand);
            if (bCount % 2 != m % 2 || bCount > m) continue;
            int lights = 0;
            // simulate
            if (((cand >> 0) & 1 ) > 0 ) lights ^= (0b111111 >> shift);
            if (((cand >> 1) & 1 ) > 0 ) lights ^= (0b101010 >> shift);
            if (((cand >> 2) & 1 ) > 0 ) lights ^= (0b010101 >> shift);
            if (((cand >> 3) & 1 ) > 0 ) lights ^= (0b100100 >> shift);
            seen.add(lights);
        }
        return seen.size();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原题:672. Bulb Switcher II There is a room with n lights wh...
    默写年华Antifragile阅读 508评论 0 0
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,465评论 0 5
  • 520,无论是否单身,所有人都在叫嚣着单身狗,仿佛在这个日子里,单身狗只是大家同情、玩笑的一个词,并不带有实质性的...
    TAENY阅读 675评论 0 3
  • 暮沉沉,华灯耀,晚课始散方归家; 滨河路,夜色好,闲人伴狗正漫步; 学子苦,赶路忙,日课方散赶晚课; 噫!...
    lusu阅读 204评论 0 0
  • 这几个月来,一直在陆陆续续地听《蒋勋细说红楼》系列音频作品。蒋勋老师从人性的角度出发,将自己半个世纪阅读《红楼梦》...
    Kassie阅读 1,697评论 0 2