最短路分类里的,zoj只有50个人过,暴汗,不过应该大多数是被冗长的题目给吓住了吧。
给你地图,图中的1代表这里有根据地,你越靠近根据地,越容易被敌人发现,危险等级越高。不能从根据地中间穿过。
给你起点,终点,求最少的危险等级和使之可以到达,如果没有 输出,no solution。
危险等级是这么定义的,你在某个点,这个点离它最近的根据地的距离为d,那么,这个点的危险等级就是,矩阵的长+宽-d。
我第一反应,这种图,不符合常规啊,就换了下,把图换成各自的点图,而不是用01代表格子。
这么做的好处很多哈,就是可以直观地算起点和终点了。弊端是在最后调试过程中发现的,下面会讲。
第一个BFS的工作是,把每个格子的危险等级算出来,采用用1的格子去BFS周围的格子。
第二个BFS就是利用优先队列去算从起点到达终点的最短路了。其中dd数组标记当前从s点到各个点的路,然后如果可以更新的话,就加入队列。我过了之后,把dd给去掉了,MLE了,队列存不下了 = =。。。其中判断不能从根据地里面过我写了个函数,经画图可以看到,只要11的同一侧有0,或者11 在边界处,肯定可以过去。
说下这么存的弊端了,样例过之后WA掉了。自己做了几个数据,发现问题了。看下图右边。
图中也解释了。右边粉色圆圈画起来的,这种情况,都被1 1 覆盖掉了,但是其实中间那俩11还是可以通过的。这时候就要判断原图这里是否是空格子。画画图就知道怎么判断了,很简单,因为坐标基本还是完全对应的。
党的做法是BFS + dij。大致就是,建图,邻接表,每个点和周围四个点相连,然后求最短路。不过木有我的跑得快,嘻嘻。
我这题在zoj排名第四,哈哈~~~