题目来自noi导刊2010/8/20第六期p32。数据可以到http://cid-32b8c60c3f37cbe8.office.live.com/browse.aspx/OI%E8%B5%84%E6%96%99下载。是其中的“noi导刊 冲刺2010模拟(7)”数据下的flip
题目描述:
给一个4*4的正方形,上面用w表示白棋子,b表示黑棋子。每次可以翻转一个棋子,其上下左右的棋子也被翻转(颜色变为相反)。问最少需要多少次翻转能够转为全黑或全白的状态。
例如:输入
bwwb
bbwb
bwwb
bwww
输出
4
如果不可能实现输出“Impossible"
这题如果用宽搜而不加优化的话,效率是绝对过不去的,产生的状态数也是无法忍受的。
优化:
4*4的棋盘16个子,每个子2个状态。这就可以用一个二进制数来表示。这个数的范围就是 0(2) 到 1111111111111111(2)。最大也就6万多。模拟翻转也很简单,用为操作^。这样我们不但优化了状态的表示,而且可以用hash表来判断某个状态是否搜索过。这样就解决了状态数过多无法接受的问题。其实宽搜能用的剪枝方式不多,我知道的就只有状态判重。