#include <stdio.h>
int n, m;
int count=0;
char s[1001][1001];
int visited[1001][1001]={0};
int direction[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int x,int y)
{
    if(x<0||x>=n||y<0||y>=m) return;
    if(s[x][y]=='#') return;
    if(visited[x][y]==1) return;
    visited[x][y]=1;
    if(s[x][y]=='!')
    {
            count++;
    }
    for(int i=0;i<4;i++)
    {
        int nx=x+direction[i][0];
        int ny=y+direction[i][1];
        dfs(nx,ny);
    }
}
int main() 
{
    scanf("%d %d",&n,&m);
    int flag_n,flag_m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf(" %c",&s[i][j]);
            if(s[i][j]=='@')
            {
                flag_n=i;
                flag_m=j;
            }
        }
    }
    dfs(flag_n,flag_m);
    printf("%d",count);
    return 0;
}

核心出装:DFS 。