简单题
#include < iostream >
#include < cstdio >
#include < cstdlib >
#include < cstring >
#include < queue >
using namespace std;
#define maxn 25
struct XPoint
{
int x, y;
} a;
bool map[maxn][maxn], vis[maxn][maxn];
int n, m, ans;
int dir[ 4 ][ 2 ] =
{
{ 0 , 1 },
{ 0 , - 1 },
{ 1 , 0 },
{ - 1 , 0 } };
void input()
{
for ( int i = 0 ; i < n; i ++ )
{
for ( int j = 0 ; j < m; j ++ )
{
char ch;
scanf( " %c " , & ch);
if (ch == ' # ' )
map[i][j] = false ;
else
map[i][j] = true ;
if (ch == ' @ ' )
{
a.x = i;
a.y = j;
}
}
getchar();
}
}
bool ok(XPoint & a)
{
if (a.x < 0 || a.y < 0 || a.x >= n || a.y >= m)
return false ;
return ! vis[a.x][a.y] && map[a.x][a.y];
}
void bfs()
{
memset(vis, 0 , sizeof (vis));
queue < XPoint > q;
q.push(a);
vis[a.x][a.y] = true ;
ans = 0 ;
while ( ! q.empty())
{
XPoint a = q.front();
q.pop();
ans ++ ;
XPoint b;
for ( int i = 0 ; i < 4 ; i ++ )
{
b.x = a.x + dir[i][ 0 ];
b.y = a.y + dir[i][ 1 ];
if (ok(b))
{
q.push(b);
vis[b.x][b.y] = true ;
}
}
}
}
int main()
{
// freopen("t.txt", "r", stdin);
while (scanf( " %d%d " , & m, & n), m | n)
{
getchar();
input();
bfs();
printf( " %d\n " , ans);
}
return 0 ;
}