思路来源:https://blog.csdn.net/riba2534/article/details/79319597
题目描述
这个挖矿游戏会给出一个n*m个格子的地图,每个格子都有黄金。在游戏开始时小明会随机出现在地图的某一个格子当中。小明可以将他所在的格子的黄金收归囊中,并且还可以向下或者向右移动,然后继续收集黄金。地图上某些格子是障碍物,小明不能移动到有障碍物的格子上。不过,在游戏开始时,小明可以随意地在地图上放置传送门。传送门可以传送到地图上某一个确定的格子,传送门放置的位置和该传送门传送的位置在游戏开始之前必须放置和设置好传送地点。小明有无数个传送门可以使用,但是每次使用传送门所需要的游戏币也是很多的。小明想要至少要使用多少个传送门才能让他在游戏时无论出现在哪个格子,他都能拿到地图上的所有金子。
输入描述:
有多组测试数据。 对于每一组数据: 第一行输入两个整数n和m(0
输出描述:
输出一行。此行包括一个整数,表示小明所需传送门数量的最小值。
输入
3 3
...
.#.
...
- 1
- 2
- 3
- 4
- 5
输出
1
- 1
- 2
思路
首先题意很明确,有一个1000*1000迷宫,里面有墙和空地,每块空地上都有金子。开始时你会被放在地图的任意空地,之后你只可以往右走或者往下走,边走可以边把路过的金子收入囊中。游戏开始时允许你在地图的一些格子放一些传送门,对于每一个传送门,你也要规定一个传送的位置,当你在游戏开始之后到达某个传送门,可以传送到该传送门的指定位置。问你一开始最少放置多少个传送门可以保证无论开局时你的位置在哪里,都可以把所有金子拿走。
我们只需要把传送门安放在无路可走的位置(出度为0),传送的位置只需要选择没有前驱(入度为0)的位置,所以我们要的答案就是找出出度为0和入度为0的点数量的最大值,特判空地小于等于1的情况(和给了一个有向图,问需要加多少条边使这个图强连通类似)
心得
通过该题,学会一个gold=1的特判(如果只有一块有金子,那么开局一定会出现在这里)
此外,如果只能向右或向下走,该图可以转化为一个有向图,我们只需让起点和终点连到一起(在终点处添加连向所有入度的传送门即可),即问题转化为连边使该图成为一个连通图。
更一般情况,若图由几个子图组成,如:
①两个入点A、B,一个出点C
②一个入点D,一个出点E
③……
我们只需保证,从任何一个图的任意一个点出发,都能到达其他任意一个图的入点即可。
这样把第i个子图的出点都连到第i+1个子图的入点上即可,答案应该是入点个数和出点个数的较大值
/*注意到这题中子图出点是一个,比较特殊*/
注意到如果样例为
2 2
#*
**
时,不同AC程序对应不同结果,估计是测试数据不够强所致。
//有的程序答案设置为入点个数的值,有的设置为出点个数,大概因为样例入点=出点吧