种南瓜

种南瓜

时间限制: 2 Sec  内存限制: 128 MB

题目描述

一班的同学们决定在班上种南瓜时,pac 感到十分震惊,因为种南瓜是分耗费班级空间的。一班拥有一块 n×m 的地,可以在其中任意一个单元格上种南瓜秧,而南瓜会长在种上的相邻格子,一个格子最多长一个南瓜 。

当然,并不像 MC 中的南瓜长成方式,一班的南瓜经过基因变异,一只南瓜秧可以长出多个南瓜,也就是说,如果四周都没有被占用,仅种下一枝就可收获 4 个南瓜。

pac 已经得知同学们种南瓜的具体方案,她想知道最多可以收获多少个南瓜。

班长 Marser 还想知道,如果南瓜没有经过变异,也就是说一枝南瓜秧只能长出最多一个南瓜,合理种植,这块地上最多能出南瓜的数量 。

输入

第一行两个正整数 n、m(2≤m,n≤5000),为地的大小 。
第 2−n+1 行 ,每行 m 个数字,第 i 行第 j 个数字为 0 或 1,如果等于 1,表示 ai,j这块地上将种下南瓜秧;如果为 0,表示不种。

输出

输出一行两个整数 P、M,分别回答 pac 和 Marser 的问题 。

样例输入

5 6
0 0 0 0 0 0
0 1 1 0 0 0
0 0 1 1 0 0
0 0 1 0 1 0
0 0 0 0 0 0

样例输出

11 24

题解

  这是个奇葩题目。算过来算过去不知道样例24是怎么来的,实在是没想到瓜居然还能长到外面去......知道瓜能长到外面这一点后,直接暴力就行了。

 1 #include<cstdio>
 2 #include<iostream>
 3 #define RG register
 4 #define IL inline
 5 using namespace std;
 6 const int N = 5009;
 7 int n, m, ans;
 8 int g[N][N];
 9 int gx[] = {0, 0, 1, -1};
10 int gy[] = {1, -1, 0, 0};
11 IL int read()
12 {
13     int num = 0; char c; bool flag = 0;
14     while((c=getchar()) == ' ' || c == '\n' || c == '\r');
15     if(c == '-') flag = 1; else num = c - '0';
16     while(isdigit(c=getchar()))
17         num = num * 10 + c - '0';
18     return flag ? - num : num;
19 }
20 int main()
21 {
22     n = read(); m = read();
23     for(RG int i = 1; i <= n; i++)
24         for(RG int j = 1; j <= m; j++)
25             g[i][j] = read();
26     for(RG int i = 1; i <= n; i++)
27         for(RG int j = 1; j <= m; j++)
28             if(g[i][j] == 1)
29             {
30                 for(RG int k = 0; k < 4; k++)
31                     if(g[i+gx[k]][j+gy[k]] == 0)
32                         g[i+gx[k]][j+gy[k]] = -1;
33             }
34     for(RG int i = 0; i <= n+1; i++)
35         for(RG int j = 0; j <= m+1; j++)
36             if(g[i][j] == -1)
37                 ans++;
38     printf("%d %d\n", ans, 2*(n+m)-4+(n-2)*(m-2)/2);
39     return 0;
40 }
View Code
 

猜你喜欢

转载自www.cnblogs.com/Jony-English/p/12960917.html
今日推荐