题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=4634
题目大意
有一个豆腐块想要从初始位置走到出口位置(EXIT),移动方向为上下左右,像象棋里的车,只有走到头才可以改变方向,或者遇到强制转向(L,R,U,D)时转向。如果EXIT被锁住了,那么必须搜集到所有钥匙才可以打开门。当钥匙不全的时候,出口处和普通路没区别。问最少需要多少操作能出去。
这里有一点不太清楚的地方,问多少操作是撞墙转向的数量,遇到强制转换不算转向。
思想
问最短多少步,BFS是显然的。然而直接裸BFS会有两个问题,一个是不好记录取得钥匙的情况,一个是会超时。所以使用状态压缩进行优化。
题目指出,最多7把钥匙,所以我们以二进制位0,1记为没取得钥匙,取得了钥匙。
对于一个方格内的状态,我们可以用四个参数描述。横坐标,纵坐标,当前取得的钥匙和当前面朝的方向。所以用”used[x][y][ss][dir]”记录状态,重复就不再入队了。
代码
1 |
|
后记
坚持。