小明的挖矿之旅_牛客网(思维题)

小明的挖矿之旅

链接:https://ac.nowcoder.com/acm/problem/15119
来源:牛客网

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

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

.#.

输出
复制
1

思路

传送门的次数==走不动的次数//右下都到边界或者遇到了障碍物无法前进,则需要传送门。
注意思维严谨性,考虑只有一个金子然后被包围的情况。


#include <iostream>
#include<string>
using namespace std;


int main()
{
	int n, m;

	while (cin >> n >> m)
	{
		int sum = 0, gold = 0;
		char mp[1000][1000];
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				cin >> mp[i][j];
			}
		}
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				if (mp[i][j] == '.')
					gold++;
				else
				{
					continue;
				}
				if ((mp[i+1][j] == '#' || i + 1 == n) && (mp[i][j + 1] == '#' || j + 1 == m))
				{
					sum++;
				}
			}
		}
		if (gold <= 1)
			cout << 0 << endl;
		else
		{
			cout << sum << endl;
		}


	}
	
	return 0;
}
原文地址:https://www.cnblogs.com/gidear/p/11773645.html