HDU 2128 Tempter of the Bone II

这是一道搜索的题目,不算太难,思路和其他搜索题目一样

用广搜 , 起初考虑问题时简单的把所有找过的点都标记为1, 问题来了

当找到钥匙时没有办法返回,于是考虑取消标记, 虽然样例可以输出,但

明显很占内存,因为每个点可以被重复访问,由此可见还是要标记的,问题

是怎么标记。 首先想到的是访问过的依旧标记为1,有炸药时可以通过,没

炸药时不能通过,虽然比开始时减少了一定访问量,但依旧很占内存,因为

一旦有了炸药就能“横行霸道”,那怎么办?然后才考虑到用三维数组,没有

炸药、一块炸药、两块钥匙......都可以做相应的标记。解决这个问题的同时理

解了状态压缩。

但在做的过程中发现用广搜不太不可行,因为广搜是多线程的,一扇门被炸

过之后,就可以通行,但这种通行只是针对当前的状态而言,对当前状态来说

门是不存在的,而对其他状态而言门是存在的,所以用广搜还需要标记门的状

态能否通行,但怎么标记?

其实不用这样,就用状态压缩,当进入一个新的状态是就相当于进入了一个

新起点,起点至终点是可以找到一条最短路径的。

问题就在于如何标记被炸过的墙,墙被炸过之后,炸药数量就会减少,状态

就会改变,而仅以炸药数量来判断状态,不太可行,因为存在炸过之后,又捡

到其他炸药,数量会变自然状态会变,遇到以前炸过的墙是还是不过?怎么

去记录还是不太清楚。。。

但如果用深搜的话,单线程,肯定能找到,但怎么求最短路径?



样例:

6 5
S.XX1
X.1X1
XX.X.
XXXXX
XXXXX
XXXDX
2 6
S.1XXD
1..XXX
4 4
S1X1
XXXX
XXDX
XXXX
6 2
S1
..
1X
XX
XX
DX

输出:
17
9
8
9

你可能感兴趣的:(压缩,搜索,ACM,HDU,bfs)