(*)2018年全国多校算法寒假训练营练习比赛(第四场)D-小明的挖矿之旅(思路)

链接:https://www.nowcoder.com/acm/contest/76/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述 
    这个挖矿游戏会给出一个n*m个格子的地图,每个格子都有黄金。在游戏开始时小明会随机出现在地图的某一个格子当中。小明可以将他所在的格子的黄金收归囊中,并且还可以向下或者向右移动,然后继续收集黄金。地图上某些格子是障碍物,小明不能移动到有障碍物的格子上。不过,在游戏开始时,小明可以随意地在地图上放置传送门。传送门可以传送到地图上某一个确定的格子,传送门放置的位置和该传送门传送的位置在游戏开始之前必须放置和设置好传送地点。小明有无数个传送门可以使用,但是每次使用传送门所需要的游戏币也是很多的。小明想要至少要使用多少个传送门才能让他在游戏时无论出现在哪个格子,他都能拿到地图上的所有金子。

输入描述:
有多组测试数据。
对于每一组数据:
第一行输入两个整数n和m(0
接下来输入n行,每行m个字符。每个字符只存在“.”和“#”,“.”表示此格子是黄金,“#”表示此格子是障碍物。
输出描述:
输出一行。此行包括一个整数,表示小明所需传送门数量的最小值。
示例1
输入
3 3
...
.#.
...
输出
1

题意:一开始题意就没看懂,还以为障碍物下面也有黄金来着。。其实是没有的。还有一个就是传送门不是用一次就失效了,以后每次到这一点都能传送。

思路:遍历这个地图,对每个点如果是黄金,再判断它的右边和下面是不是障碍物,如果满足就要放一个传送门。最后还要特判一下,如果只有一个点有黄金,那么主人公一上来就可以取走,所以结果恒为0。

这样的题目还挺有意思的,如果想到了,代码很简单,如果想不到就呵呵了。。

代码:

#include
#include
#include
#include
#include
#include
#define IO ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n, m, ans, cnt;
char a[1010][1010];
int main()
{
	while(cin >> n >> m){
		ans=0;cnt=0;
		for(int i = 0; i < n; i++){
			cin >> a[i];
		}
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				if(a[i][j] == '.'){
					cnt++;
					if((i+1==n||a[i+1][j]=='#') && (j+1==m||a[i][j+1]=='#')){
						ans++;
					} 
				}
			}
		} 
		if(cnt==1)
			cout << "0" << endl;
		else
			cout << ans << endl;
	}
	return 0;
} 

你可能感兴趣的:(思路)