P1225 黑白棋游戏 题解

· · 题解

看到大佬们都用了 BFS+状态压缩+位运算,这里提供一个 BFS+简单状态压缩 的做法。

其实这题广搜也没什么难的,就是正常的广搜,只是我一开始写了结构体里传数组,CE 了,所以不得已用了一种稍微麻烦一点的做法。但也无伤大雅。

思路

先定义一个结构体(结构体乃日常广搜操作),然后整一个记录状态的 map,因为这次记录的有点不太一样,是一个字符串(因为我把数组压成字符串操作),所以不能用数组,每次遍历 16 个位置(4 \times 4 = 16),算出这个位置所在行数(下面会说怎么算),枚举相邻的格子,算出它在压缩后的字符串的位置(下面会说怎么算),交换这两个位置,如果当前的状态已经出现过,continue,否则将这个状态放进队列,更新步数和路径(之后会说),当当前队首的状态已经等于目标状态,那么输出步数和路径(之后会说)。

细节