思路:网格图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()