【宽度优先搜索】神奇的状态压缩CodeVs1004四子连棋 | 首都客運時刻表查詢網
![【宽度优先搜索】神奇的状态压缩CodeVs1004四子连棋](https://i.imgur.com/2oxSoeJ.png)
2016年10月24日—...某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为...请注明出处http://www.cnblogs.com/Maki-Nishikino/p/5991570.html.
![【宽度优先搜索】神奇的状态压缩CodeVs1004四子连棋](https://i.imgur.com/2oxSoeJ.png)
其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度。博主写这篇blog主要是想写下一个想法——状态压缩。状态压缩在记录、修改状态以及判重去重等方面有着极高的(←_←词穷了,诸位大致理解一下就好)效率。博主原本打算在blog介绍一种DP——状态压缩型动态规划,但动笔(键盘??)前,博主突然想起自己前些年写过的一道广搜题,当时在判重方面冥思苦想想出了一种类似状态压缩的方法,开心了好久,于是在此先抛砖引玉为状压DP做个铺垫。
Description在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。
Input Description从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
Output Description用最少的步数移动到目标棋局的步数。
Sample InputBWBO WBWB BWBW WBWO
Sample Output5
原题链接→_→:|1004 四子连棋|CODEVS,算法爱好者社区[1]
大体思路大家都懂,一个中规中矩的广搜没什么好说的,主要来说说状态压缩。我们知道由于不同的棋盘状态经过不同的操作后可能得到同一张棋盘,所以为了节省空间和时间,我们需要进行判重操作——即如果一个棋盘状态已经如果队了,我们不会将其第二次入队。然而如何存储棋盘状态成了一个问题,这时我们就需要用到神奇的状态压缩了。我们发现,一个棋盘中有且仅有三种元素,我们不妨规定0代表空格,1代表白棋,2代表黑棋。如此一来,每张棋盘都被转化成了一个独一无二的三进制数,每个三进制数转化成十进制数...