Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

var (
	sc = bufio.NewScanner(os.Stdin)
)

type Color int

const (
	ColorBlack Color = iota
	ColorRed
)

type Node struct {
	ID    int
	X, Y  int
	Color Color
	Nexts []*Node
}

func main() {
	for sc.Scan() {
		if sc.Text() == "0 0" {
			break
		}
		chunks := strings.Split(sc.Text(), " ")
		w, _ := strconv.Atoi(chunks[0])
		h, _ := strconv.Atoi(chunks[1])

		// Initialize map
		m := map[int]map[int]*Node{}
		for x := 1; x <= w; x++ {
			m[x] = map[int]*Node{}
			for y := 1; y <= h; y++ {
				m[x][y] = &Node{ID: x + y*w, X: x, Y: y}
			}
		}
		for x := 1; x <= w; x++ {
			for y := 1; y <= h; y++ {
				nexts := []*Node{}
				if n, ok := m[x-1][y]; ok {
					nexts = append(nexts, n)
				}
				if n, ok := m[x][y-1]; ok {
					nexts = append(nexts, n)
				}
				if n, ok := m[x+1][y]; ok {
					nexts = append(nexts, n)
				}
				if n, ok := m[x][y+1]; ok {
					nexts = append(nexts, n)
				}
				m[x][y].Nexts = nexts
			}
		}

		// Set colors
		queue := []*Node{}
		touchedIDs := map[int]struct{}{}
		for y := 1; y <= h; y++ {
			sc.Scan()
			for i, c := range sc.Text() {
				switch c {
				case '.', '@':
					n := m[i+1][y]
					n.Color = ColorBlack
					if c == '@' {
						queue = append(queue, n)
						touchedIDs[n.ID] = struct{}{}
					}
				case '#':
					m[i+1][y].Color = ColorRed
				}
			}
		}

		// Search
		visitedIDs := map[int]struct{}{}
		for {
			if len(queue) == 0 {
				break
			}
			n := queue[0]
			queue = queue[1:]
			visitedIDs[n.ID] = struct{}{}
			for _, next := range n.Nexts {
				if next.Color == ColorRed {
					continue
				}
				if _, ok := touchedIDs[next.ID]; !ok {
					queue = append(queue, next)
					touchedIDs[n.ID] = struct{}{}
				}
			}
		}
		fmt.Println(len(visitedIDs))
	}
}

C++: #if 0
accept?????????
40?????????????????£???

???????????¨??????????????¢?´¢???????????????????????????

???????????????????????????????????°????????????????????????
31-169584????????????????????????????????¨??£??????????????????????????£????????§????????????????????????????????????

#endif


#include <queue>
#include <iostream>
using namespace std;
int w,h;
const int dx[]={1,0,-1,0}, dy[]={0,-1,0,1};
char mat[100][100];

bool valid(int x,int y)
{
    return (x>=0)&&(x<w)&&(y>=0)&&(y<h)&&(mat[x][y]!='#');
}

void bfs(int x,int y) {
  int sum=1;
  queue<pair<int,int> >Q;// ??´??°????????????????????\????????????
  pair<int,int>p;//?????????
  p=make_pair(x,y);
  Q.push(p);
  while (! Q.empty()) {
    pair<int,int> cur = Q.front(); // ??????????´????????????????
    Q.pop();
    for (int i=0;i<4;i++) { //??????????????????????????????4?????????
      if (valid(cur.first+dx[i],cur.second+dy[i])) { //????????????????????????????????£??????
	Q.push(make_pair(cur.first+dx[i],cur.second+dy[i])); // dst ????¨???????????????????
	sum++;
	mat[cur.first+dx[i]][cur.second+dy[i]]='#';//2??????????????¢
      }
    }
    mat[cur.first][cur.second]='#';//2??????????????¢
  }
  cout<<sum<<endl;
}


int main() {
  int x,y;
  while(cin>>w>>h && w!=0){
    for(int j=0;j<h;++j){
        for(int i=0;i<w;++i){
            cin >> mat[i][j];
            if(mat[i][j]=='@'){//???????±???´???
                x=i,y=j;
            }
        }
    }
    bfs(x,y);
  }
}

C++: #include <iostream>
#include <queue>
#include <map>

using namespace std;

typedef pair<int,int> P;
typedef queue<P> Q;

const int dx[] = {1,0,-1,0};
const int dy[] = {0,1,0,-1};

#define mp make_pair

int w,h;
char fie[21][21];

void bfs(int x, int y){
    Q q;
    q.push(mp(x,y));
    while(!q.empty()){
        for(int i=0; i<4; i++){
            int xx = q.front().first + dx[i];
            int yy = q.front().second + dy[i];
            if(0 <= xx && xx <= w && 0 <= yy && yy <= h && fie[yy][xx] == '.'){
                fie[yy][xx] = '@';
                q.push(mp(xx,yy));
            }
        }
        q.pop();
    }
}

int main(){
    while(cin >> w >> h , w||h){
        int sx,sy;
        for(int i=0; i<h; i++){
            cin >> fie[i];
            for(int j=0; j<w; j++){
                if(fie[i][j] == '@'){
                    sx = j; sy = i;
                }
            }
        }
        bfs(sx,sy);
        int ans = 0;
        for(int i=0; i<h; i++){
            for(int j=0; j<w; j++){
                if(fie[i][j] == '@') ans++;
            }
        }
        cout << ans << endl;
    }
}

C++: #include<iostream>
#include<vector>
#include<cstdio>
#include<string>
#include<algorithm>
#include<numeric>
#include<map>
#include<math.h>

using namespace::std;

char gMap[21][21];
bool MapFlg[21][21];
int gRedCount;
void initMap(void)
{
  for(int i = 0; i < 21; i++)
    {
      for(int j = 0; j < 21; j++)
	{
	  gMap[i][j] = '#';
	  MapFlg[i][j] = false;
	}
    }
  gRedCount = 0;
}

void showMap(void)
{
  for(int i = 0; i < 21; i++)
    {
      for(int j = 0; j < 21; j++)
	{
	  cout << gMap[i][j];
	}
      cout << endl;
    } 
}

int countMap(int x , int y)
{
  int dx[] = { 0  , 1 , -1 , 0 };
  int dy[] = { -1 , 0 ,  0 , 1 };

  for(int i = 0; i < 4; i++)
    {
      int mx = x + dx[i];
      int my = y + dy[i];

      if( gMap[my][mx] != '@' && gMap[my][mx] != '#' && MapFlg[my][mx] == false)
	{
	  gRedCount++;
	  MapFlg[my][mx] = true;
	  countMap(mx , my);
	}
    }

  return gRedCount;

}

void calcAns(int sx, int sy)
{
  cout << countMap(sx,sy) + 1 << endl;
}

int main(void)
{

  int w,h;

  while( cin >> w >> h  && (w != 0 && h != 0))
    {
      int sx,sy;
      initMap();
      for(int i = 1; i <= h; i++)
	{
	  for(int j = 1; j <= w; j++)
	    {
	      cin >> gMap[i][j];
	      if( gMap[i][j] == '@')
		{
		  sy = i;
		  sx = j;
		}
	    }
	}
      calcAns(sx,sy);
    }


  return 0;
}

C++: #include <iostream>
#include <string>
#include <vector>
using namespace std;
int W, H, sx, sy, cnt;
vector<int> dxy = { 1, 0, -1, 0, 1 }; 
string field[20];

void fun(int y, int x){
    field[y][x] = '#';
    cnt++;
    for(int i=0; i<4; ++i){
        int ny = y + dxy[i+1],
            nx = x + dxy[i];
        if(ny < 0 || ny >= H ||nx < 0 || nx >= W || field[ny][nx] != '.') continue;
        fun(ny, nx);
    }
}
    
int main(){
    while(cin >> W >> H, (W||H)){
        cnt = 0;
        string str;
        cin.ignore();
        for(int i=0; i<H; ++i){
            cin >> field[i];
        }
        for(int i=0; i<H; ++i){
            for(int j=0; j<W; ++j){
                if(field[i][j] == '@'){
                    sx = j; sy = i;
                }
            }
        }
        fun(sy, sx);
        cout << cnt << endl;
    }
    return 0;
}

C++: #include <iostream>
using namespace std;
int W,H;
int x[4]={0,0,1,-1};
int y[4]={1,-1,0,0};
int i,j;
int count=0;
char room[100][100];

int dfs(int, int);

int main(){
  while(1){
    int sy,sx;
    scanf("%d %d",&W,&H);
    if(W==0&&H==0)break;
    for(i = 0 ; i < H ; i++){
      scanf("%c",&room[i][0]);
      for(j = 0 ; j < W ; j++){
	scanf("%c",&room[i][j]);
	if(room[i][j] == '@'){
	  sy = i;
	  sx = j; 
	}
      }
    }
    printf("%d\n", dfs(sx,sy));
  }
  return 0;
}

int dfs(int ax,int ay){
  if(ax<0||ay<0)return 0;
  if(ax>=W||ay>=H)return 0;
  if(room[ay][ax]=='#')return 0;
  room[ay][ax]='#';
  int cnt=1;
  int i;
  for(i=0;i<4;i++){
    int nx=ax+x[i];
    int ny=ay+y[i];
    cnt+=dfs(nx,ny);
  }
  return cnt;
}