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<=1000),分别表示地图的行数和列数。
接下来输入n行,每行m个字符。每个字符只存在“.”和“#”,“.”表示此格子是黄金,“#”表示此格子是障碍物。

输出描述:

输出一行。此行包括一个整数,表示小明所需传送门数量的最小值。
示例1

输入

3 3
...
.#.
...

输出

1

  1. 解题思路:统计入度为0(该点不可达)和出度为0(该点不可出)的点数,要两的 最大值。特殊情况,整个图只有一个或者0个有金子的地方,  
  2. 则不需要传送门。 
/**/
#include<bits/stdc++.h>
using namespace std;
char mp[1002][1002];
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        memset(mp,0,sizeof(mp));
        for(int i=1;i<=n;i++)
            cin>>mp[i]+1;
        int ans1,ans2,c=0;
        ans1=ans2=c=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(mp[i][j]=='.') c++;
               
                if(mp[i][j]!='#'&&mp[i-1][j]!='.'&&mp[i][j-1]!='.') 
                    ans1++;//一个点上方的左方均不可达,该点不可达;入度为0
                if(mp[i][j]!='#'&&mp[i+1][j]!='.'&&mp[i][j+1]!='.')
                    ans2++;//一个点下方和右方均不可达,则到该点后不可走;出度为0
            }
        }
        if(c<=1) puts("0");
        else printf("%d\n",max(ans1,ans2));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41668093/article/details/79614686