思路:网格图bfs。根据题意描述,其实就是网格图bfs板子题,没学过的同学可以学习一下。具体来说就是,以'@'为源点,跑一个网格图bfs,遇到非'#'的字符时判断一下是否为杂草'!',如果是的话就ans + 1;否则就是空地'.'不操作,之后把访问过的点置为'#',表示后面不再访问,接着继续跑网格图bfs,最终输出ans即可
代码:
import sys
from collections import deque
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n, m = MII()
a = [list(I()) for _ in range(n)]
q = deque([(i, j) for i in range(n) for j in range(m) if a[i][j] == '@'])
ans = 0
while q:
for _ in range(len(q)):
i, j = q.popleft()
for x, y in (i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1):
if 0 <= x < n and 0 <= y < m and a[x][y] != '#':
if a[x][y] == '!':
ans += 1
a[x][y] = '#'
q.append((x, y))
print(ans)
t = 1
# t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号