题目链接:https://vjudge.net/contest/339651#problem/A

典型的DFS题,在这里记录一下自己的习惯,复习起来会好些。

1.典型要遍历所有满足条件的点
2.输入的m,n的含义一定要清楚,谁是列,谁是行(谁是shu,谁是heng)
3.在习惯上一般有一个biaoji函数,用作标记走过的点(vis)
4.在DFS上一般写成竖和横的形式,所以在输入时就要按照这个形式进行输入(即两者要统一)
5.初始化一定要有

#include <cstdio>
#include <iostream>
using namespace std;

int xx[10]={0,1,-1,0,0};
int yy[10]={0,0,0,1,-1};

int sum;
char a[25][25];
int  biaoji[25][25];
int m,n;

void DFS (int y,int x)
{
    for (int i=1;i<=4;i++)
    {
        int s=y+yy[i];
        int h=x+xx[i];
        if(h>=1 && s>=1 && h<=m && s<=n)
        {
            if(a[s][h]=='.' && biaoji[s][h]==0)
            {
                biaoji[s][h]=1;
                sum++;
                DFS(s,h);
            }
        }
    }
}
int main ()
{
    while (cin >> m >> n)
    {
        if(m==0 && n==0) break;

        memset(a, 0, sizeof(a));
        memset(biaoji, 0, sizeof(biaoji));

        for (int i=1;i<=n;i++)
        {
            for (int j=1;j<=m;j++)
            {
                cin >> a[i][j];
            }
        }
        sum=1;
        for (int i=1;i<=n;i++)
        {
            for (int j=1;j<=m;j++)
            {
                if(a[i][j]=='@')
                {
                    DFS(i,j);
                }
            }
        }
        cout << sum << endl;
    }
    return 0;
}