这是一道搜索的题目,不算太难,思路和其他搜索题目一样
用广搜 , 起初考虑问题时简单的把所有找过的点都标记为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