bfs求最短路这里就不解释了。关键是一些本题特有的判断。首先,因为0代表障碍,所以我们可以将外面memset成0,然后照样读入就行了。然后再bfs时,连同原本的障碍物一同判掉就可以了。
另外,血量也是个神奇的东西。考虑到,如果你的血量只剩1了,而此时你还没有完成任务,那么你无论再怎么走都是GAMEOVER的。所以,血量剩1时,直接就跳出就行了。
那么,如何判重呢?如果不判重,那么就可能会陷入无限的死循环……而此题又难以直接用是否到过一点判重,例如下图:
#020 #010 #010 #010 #410 #013 ##那么,唯一可以完成任务的路线是:(1,2)->(2,2)->(3,2)->(4,2)->(5,2)->(5,1)->(5,2)->(6,2)->(6,3)。
可以发现,点(5,2)是被走了两次的!所以,如果按传统方式判重就会WA。
那么,如何判重呢?我们可以引入一点贪心的思想。我们可以将visit数组从bool型转为int型,存储目前到达它的路径中,到达它时血量最多的一次的血量。因为是bfs,所以简单的证明可以知道,如果一条路径到达一个已经到达过的点,且血量还小于等于visit时,那么即使完成了任务,其步数也不会时最优的。反之,如果到达一个点,其血量值可以更大,那么这就一种可能的路径,并不是重复到达。这样,就可以既保证了答案得正确性,又保证了不会TLE
int jz[20][20]={0};//存储原地图
struct NODE//一个结点一个状态
{
int x,y