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++: #include <bits/stdc++.h>
using namespace std;

int solve(int W, int H) {
    vector<vector<char>> field(H + 2, vector<char>(W + 2, '#'));
    vector<vector<int>> cnt(H + 2, vector<int>(W + 2, 0));
    pair<int, int> p;
    queue<pair<int, int>> Q;

    for (int i = 1; i <= H; i++) {
        for (int j = 1; j <= W; j++) {
            cin >> field[i][j];
            if (field[i][j] == '@') {
                Q.push(make_pair(i, j));
                cnt[i][j] = 1;
            }
        }
    }

    int dx[] = {1, -1, 0, 0};
    int dy[] = {0, 0, 1, -1};
    while (!Q.empty()) {
        p = Q.front();
        Q.pop();
        for (int i = 0; i < 4; i++) {
            int ny = p.first + dy[i];
            int nx = p.second + dx[i];
            if (field[ny][nx] == '#') continue;
            if (cnt[ny][nx] == 1) continue;
            Q.push(make_pair(ny, nx));
            cnt[ny][nx] = 1;
        }
    }
    int ret = 0;
    for (int i = 0; i < cnt.size(); i++) {
        for (int j = 0; j < cnt[i].size(); j++) {
            if (cnt[i][j] == 1) ret++;
        }
    }

    return ret;
}

int main() {
    int W, H;
    vector<int> ans;
    while (1) {
        cin >> W >> H;
        if (!W && !H) break;
        ans.push_back(solve(W, H));
    }

    for (int r : ans) cout << r << endl;
}

C++: #include <iostream>
using namespace std;

void checkboard(void);
void startmove(void);
int checked(int i,int j);

char board[20][20];
int H,W,now[2];

int main(void){
	while(1){
		cin >> H >> W ;
		if (!H && !W) break;
		// count=0;
		for(int i=0;i<W;i++){
			for(int j=0;j<H;j++){
				cin >> board[i][j];
				if(board[i][j]=='@'){
					now[0]=i;
					now[1]=j;
				}
			}
		}
		startmove();
		checkboard();
	}

}


void startmove(void){
	int n;
	do{
		n=0;
		for(int i=0;i<W;i++){
			for(int j=0;j<H;j++){
				if(board[i][j]=='@')
					n+=checked(i,j);
			}
		}

	}while(n);
}

int checked(int i,int j){
	int a=0;
	if(i>=0 && board[i-1][j]=='.'){
		board[i-1][j]='@';
		a=1;
	}
	if(i<W && board[i+1][j]=='.'){
		board[i+1][j]='@';
		a=1;
	}
	if(j>=0 && board[i][j-1]=='.'){
		board[i][j-1]='@';
		a=1;
	}
	if(j<H && board[i][j+1]=='.'){
		board[i][j+1]='@';
		a=1;
	}
	// checkboard();
	return a;
}
void checkboard(void){
		int count=0;
		for(int i=0;i<W;i++){
			for(int j=0;j<H;j++){
				if(board[i][j]=='@') count++; 
				// cout << board[i][j];
			}
		}
			cout << count << endl;

}

C++: #if 0
08-162015?????????????????°???????????????????????????
pair???
#endif

#include <iostream>
#include <queue>
#include <string.h>
#include <utility>
using namespace std;

int w,h;
int tot=1; //?????£????????????(?????????????????????)
const int dx[]={1,0,-1,0}, dy[]={0,-1,0,1}; //??????????§??????¨
char P[30][30]; //??§?¨?????????????????????¨???

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

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

int main(){
	int x1,y1;
	while((cin>>w>>h)&&(w!=0&&h!=0)){
		for(int i=0;i<h;++i){
			for(int j=0;j<w;++j){
				cin>>P[i][j];
				if(P[i][j]=='@')
					x1=i; y1=j; 
			}
		}
		bfs(x1,y1); //??????????????°????????£??\????????¢?´¢????§?
		cout << tot << endl;
	}
}

C++: #include<iostrem>
#include<utility>
#include<queue>
using namespace std;
char room[21][21];
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
typedef pair<int,int> p;


int main(){
	int x,y;
	queue<p> que;
	int w,h;
	cin>>w>>h;
	if(w+h==0) return;
	for(int a=0;a<h;a++){
		for(int b=0;b<w;b++){
			cin>>room[a][b];
			if(room[a][b]=='@'){
				x=b,y=a;
				que.push(p(b,a));
				room[a][b]='#';
			}
		}
	}
	int cnt=1;
	int nx,ny;
	while(que.size()){
		p ap=que.front();
		que.pop;
		for(int i=-1;i<=1;i++){
			nx=ap.first+dx[i];
			ny=ap.second+dy[i];
			if(0<=nx&&nx<=w&&0<=ny&&ny<=h&&room[ny][nx]!='#'){
				room[ny][nx]='#';
				que.push(p(nx,ny));
				cnt++;
			}
		}
	}
}

C++: #include<iostream>
#include<vector>

using namespace std;
vector<int> ans;
int cf[20][20];
bool field[20][20];
int w,h;
void dfs(int i,int j,int count);

int main(){
	while(1){
		cin >> w >> h;
		if(w + h == 0) break;
		for(int i = 0;i < 20;i++){
			for(int j = 0;j < 20;j++){
				cf[i][j] = -1;
				field[i][j] = false;
			}
		}
		
		int px,py;
		for(int i = 0;i < h;i++){
			for(int j = 0;j < w;j++){
				char t;
				cin >> t;
				if(t == '.') field[i][j] = true;
				else if(t == '@'){ px = j; py = i;field[i][j] = true;}
			}
		}
		
		int counta = 0;
		for(int i = 0;i < h;i++){
			for(int j = 0;j < w;j++){
				if(field[i][j] && cf[i][j] == -1){
					dfs(i,j,counta);
					counta++;
				}
			}
		}
		
		int pn = cf[py][px];
		int count = 0;
		for(int i = 0;i < h;i++){
			for(int j = 0;j < w;j++){
				if(cf[i][j] == pn) count++;
			}
		}
		
		ans.push_back(count);
	}
	for(int i = 0;i < ans.size();i++) cout << ans[i] << endl;
	return 0;
}

void dfs(int i,int j,int count){
	cf[i][j] = count;
	if(i != 0 && field[i-1][j] && cf[i-1][j] == -1) dfs(i-1,j,count);
	if(i != h-1 && field[i+1][j] && cf[i+1][j] == -1) dfs(i+1,j,count);
	if(j != 0 && field[i][j-1] && cf[i][j-1] == -1) dfs(i,j-1,count);
	if(j != w-1 && field[i][j+1] && cf[i][j+1] == -1) dfs(i,j+1,count);
}