简单dfs,直接找到起始点递归就可以了。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
using namespace std;
int m,n;
char ch[30][30];
int Nx[4][2] = {1,0,-1,0,0,1,0,-1};
int ans;
void dfs(int x, int y)
{
for (int i = 0; i < 4; i++)
{
int nx = x+Nx[i][0];
int ny = y+Nx[i][1];
if (nx<0||ny<0||nx>=m||ny>=n)
continue;
if (ch[nx][ny]=='#')
continue;
ch[nx][ny]='#';
ans++;
dfs(nx,ny);
}
return;
}
int main(void)
{
while (scanf("%d %d", &n, &m))
{
ans=0;
int sx,sy;
if (m==0&&n==0)
break;
for (int i = 0; i < m; i++)
{
scanf(" %s", ch[i]);
for (int j = 0; j < n; j++)
{
if (ch[i][j]=='@')
{
sx=i;
sy=j;
}
}
}
ans++;
ch[sx][sy]='#';
dfs(sx,sy);
printf("%d\n",ans);
}
return 0;
}