题意:给一个最多8 8的方格,’.’代表为开,’‘代表为关,每次反转一个按钮,那么它周围的八个联通块都会翻转。问最少多少次将其变成全关,如果不可能输出-1。
按状压思路想,8联通单独处理很麻烦,我们可以预处理出一行所有翻转情况对上中下三行的影响。dp[i][s],s高m位代表上一行的状态,s低m位表示中间这行的状态,现在翻转的是i+1行,那么这一次翻转过之后,后面的翻转对这次的高m位永远不会有影响,因此在这一次翻转,必须把其全部置为1,找一开始预处理中“上”满足异或和全部为1的翻转,然后进行转移。我用了一个队列维护状态,因为状态太多了,怕超时…然而现在突然发现好像更慢(对的,是更慢了,刚测过,以后再也不用队列写状压…)。
1 |
|