顽皮恶魔 牛客白月赛44
鏈接:https://ac.nowcoder.com/acm/contest/11221/B
來源:牛客網
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
浮云陰,驟雨傾,頑皮惡魔鐮刀顯。
你的莊園是一塊 n\times mn×m 的草坪。
現在有一些格子是普通植物 \tt PP,有一些格子是蘿卜保護傘 \tt *?,有一些格子是僵尸 \tt ZZ。(已經在格子上的僵尸不會吃掉植物或移動)
tip:蘿卜保護傘可以保護周圍 3\times33×3 的植物,即一個位于位置 (x,y)(x,y) 的蘿卜保護傘可以保護位于 (x\pm1,y),(x,y\pm1),(x\pm1,y\pm1)(x±1,y),(x,y±1),(x±1,y±1) 以及自身九個格子上的植物。
現在你想知道,對于這樣一塊給定的草坪,假設有無窮多個飛賊,能夠偷走最多數量的植物是多少。
輸入描述:
全文第一行輸入一個正整數 T(1\le T\le10^5)T(1≤T≤10
5
),表示數據組數。
每組數據第一行輸入兩個正整數 n,m(1\le n,m\le10^3)n,m(1≤n,m≤10
3
),表示草坪的長和寬。
接下來輸入一個 n\times mn×m 的字符矩陣表示草坪的大小,字符矩陣中僅包含 \tt ZZ、\tt PP、\tt *? 三種字符。
數據保證 \sum n\times m\le2\times10^6∑n×m≤2×10
6
。
輸出描述:
每行輸出一個整數表示最多被偷走的植物數量。
示例1
輸入
復制
1
5 5
ZPZPZ
PPZP
ZPZPZ
PZPZP
ZPPZ
輸出
復制
5
說明
分別位于 (2,2)(2,2) 和 (5,3)(5,3) 上的保護傘可以保護周圍的植物,最后能被偷走的植物如下圖所示:(## 表示即將被偷走,\tt *? 表示保護傘,\tt PP 表示被保護)
肉眼可見最后有分別位于 (1,4),(2,5),(3,4),(4,1),(4,5)(1,4),(2,5),(3,4),(4,1),(4,5) 的五株被偷走。
#include <iostream> #include <vector> using namespace std;const int N = 1e3 + 10;char g[N][N];void solve() {int n, m; scanf("%d%d", &n, &m);getchar();for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);int cnt1 = 0, cnt2 = 0;for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )if (g[i][j] == 'P')cnt1 ++ ;for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )if (g[i][j] == '*'){for (int ii = -1; ii <= 1; ii ++ )for (int jj = -1; jj <= 1; jj ++ ){int dx = i + ii, dy = j + jj;if (dx < 0 || dx >= n || dy < 0 || dy >= m) continue;if (g[dx][dy] == 'P') cnt2 ++ ,g[dx][dy] = 'Z';}}printf("%d\n", cnt1 - cnt2); }int main() {int _; cin >> _;while (_ -- )solve(); }總結
以上是生活随笔為你收集整理的顽皮恶魔 牛客白月赛44的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深渊水妖 模拟,贪心 牛客白月赛44
- 下一篇: 绝命沙虫 精度,double,模拟 牛客