小明的挖矿之旅

链接:https://www.nowcoder.net/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 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 #define maxn 1005
 5 int n,m;
 6 char s[maxn][maxn];
 7 void work(){
 8     for(int i=1;i<=n;i++){
 9         scanf("%s",s[i]+1);
10     }
11     memset(s[n+1],0,sizeof(s[0]));
12     int a,b,c;a=b=c=0;//aÊÇÈë¶ÈΪÁãµÄ.¸öÊý,bÊdzö¶ÈΪÁãµÄ.¸öÊý,cÊÇ.¸öÊý
13     for(int i=1;i<=n;i++){
14         for(int j=1;j<=m;j++){
15             if(s[i][j]!='.')continue;
16             if(s[i-1][j]!='.'&&s[i][j-1]!='.')a++;
17             if(s[i+1][j]!='.'&&s[i][j+1]!='.')b++;
18             c++;
19         }
20     }
21     if(!c)printf("0\n");
22     else if(a==c)printf("%d\n",a-1);
23     else printf("%d\n",a>b?a:b);
24 }
25 int main(){
26     while(~scanf("%d%d",&n,&m))work();
27     return 0;
28 }
View Code
 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4  
 5 char a[1010][1010];
 6 int n, m;
 7  
 8 int main()
 9 {
10     int ans1 = 0, ans2 = 0, cnt = 0;
11  
12     while(~scanf("%d%d", &n, &m))
13     {
14         memset(a, 0, sizeof(a));
15  
16         for(int i = 1; i <= n; i++)
17             scanf("%s", a[i] + 1);
18  
19         for(int i = 1; i <= n; i++)
20         {
21             for(int j = 1; j <= m; j++)
22             {
23                 if(a[i][j] == '.') cnt++;
24  
25                 if(a[i][j] != '#' && a[i - 1][j] != '.' && a[i][j - 1] != '.')
26                     ans1++;
27  
28                 if(a[i][j] != '#' && a[i + 1][j] != '.' && a[i][j + 1] != '.')
29                     ans2++;
30             }
31         }
32  
33         printf("%d\n", cnt == 1 ? 0 : max(ans1, ans2));
34     }
35  
36     return 0;
37 }
View Code
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3  
 4 char a[1010][1010];
 5 int n,m;
 6  
 7 int main()
 8 {
 9     int ans1=0,ans2=0,cnt=0
10     ;
11     while(~scanf("%d%d",&n,&m))
12     {
13         memset(a,0,sizeof(a));
14         for(int i=1;i<=n;i++)  scanf("%s",a[i]+1);
15         for(int i=1;i<=n;i++)
16         {
17             for(int j=1;j<=m;j++)
18             {
19                 if(a[i][j]=='.') cnt++;
20                 if(a[i][j]!='#'&&a[i-1][j]!='.'&&a[i][j-1]!='.') ans1++;
21                 if(a[i][j]!='#'&&a[i+1][j]!='.'&&a[i][j+1]!='.') ans2++;
22             }
23         }
24         printf("%d\n",cnt==1?0:max(ans1,ans2));
25     }
26     return 0;
27 }
View Code

 

posted on 2018-02-11 21:02  蔡军帅  阅读(168)  评论(0编辑  收藏  举报