首页 > 代码库 > 有限状态搜索之BFS--再看POJ1753(一)

有限状态搜索之BFS--再看POJ1753(一)

      有近两个月没有练习ACM了,终于在进入5月的时候,决定安排好各种事情,重新把练习算法和数据结构纳入每天必做的事情之中。鉴于上一阶段练习效果,总结出来凡事必“温故而知新,三思而后行”。之前对于ACM

的各路招式(算法)抱有极大的好奇心,一口气做了不少的题,熟练度有提升,但思维能力未觉有所提高。究其原因,也是没做到“温故而知新”,缺少总结和提炼。所以,今天算是“开博立志”,从此做好总结归纳的工作。

  “新长征路”上的第一幕,便就是从以前做过的题目开始复习。回顾上一阶段的练习,当时是从网络上著名的POJ题目分类开始的,第一个问题是POJ1753(http://poj.org/problem?id=1753)。

  题干意思很简单,描述成便于算法分析的说法,即--给定初始状态S0,按照给定的状态转移方法进行状态转移,问至少多少步可以转移到“全为黑”或“全为白”的状态。

  第一步要做的就是“状态编码”,这题之所以简单就在于状态简单且为有限状态。黑白两色用(0,1)表示即可,16个方格就是16个0/1。16个“局部状态”构成一个“全局状态”。二进制编码的话,"全局状态"用一个

unsigned short类型数据就搞定(保险起见,测试下本机unsigned short是否为两个字节哦)。

  第二步要做的就是“状态转移”,按照题干的要求,16个“局部状态”中任意改变一个(0,1编码就是取反),上下左右4个位置的状态也跟着取反。具体实现时考虑下边界问题。

  第三步要做的就是“状态搜索”,由“初始状态编码”按照“状态转移”规定动作进行转化,产生新的“状态编码”,由新状态编码继续这一过程,直到找到目标状态。解题的主干内容就在于这个搜索过程的编码,题目要求最

少的步骤,那么搜索深度要尽量的浅,所以“深搜”肯定不行,看看“广搜”,他的模式是在每个深度上穷尽所有的情况,如果没有找到目标状态,再加深深度,这个题目恰好适合“广搜”的模式。BFS编码要处理的问题主要是

“创建状态队列”,“状态判重”,编码之前想清楚这些问题怎么解决,“三思而后coding”。

  以上就是对整个题目的理解和思考,“有限状态搜索之BFS--再看POJ1753(二)”将结合代码实现以上三步的内容。