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))
	}
}

Python: I=input
def f(x,y,r):
    if not(0<=x<len(r[0])and(0<=y<len(r)))or r[y][x]=='#':return 0
    r[y][x]='#'
    return 1+sum(f(x+dx,y+dy,r)for dx,dy in[[-1,0],[1,0],[0,-1],[0,1]])
while 1:
    w,h=map(int,I().split())
    if w==0:break
    r=[list(input()) for _ in[0]*h]
    for a,b in enumerate(r):
        if '@'in b:y=a;x=b.index('@');break
    print(f(x,y,r))

Python: #!/usr/bin/env python3
# -*- coding: utf-8 -*-

import array
import itertools
import sys


UNDET_POINT = (-1, -1)


class RecursiveDepthFirstSearch(object):

    def __init__(self, width, height, tiles):
        self.width = width
        self.height = height
        self.tiles = tiles
        self.reached = [array.array(
            "B", (False for j in range(height))) for i in range(width)]
        self.start_tile = UNDET_POINT
        for x, y in itertools.product(range(width), range(height)):
            if tiles[x][y] == "@":
                self.start_tile = (x, y)
                break

    def search(self, x, y):
        if x < 0 or self.width <= x or y < 0 or self.height <= y:
            pass
        elif self.tiles[x][y] == "#":
            pass
        elif self.reached[x][y]:
            pass
        else:
            self.reached[x][y] = True
            self.search(x + 1, y)
            self.search(x - 1, y)
            self.search(x, y + 1)
            self.search(x, y - 1)

    def count_reachable_tiles(self):
        self.search(*self.start_tile)
        reachable_tiles = sum([self.reached[x][y] for x, y in itertools.product(
            range(self.width), range(self.height))])
        return reachable_tiles


if __name__ == "__main__":
    sys.setrecursionlimit(10000)
    while True:
        width, height = map(int, input().split())
        if width == 0 and height == 0:
            break
        else:
            tiles = [x for x in zip(*[input() for y in range(height)])]
            dfs = RecursiveDepthFirstSearch(width, height, tiles)
            print(dfs.count_reachable_tiles())

Python: class dfs:
    def __init__(self,W,H,m):
        self.W=W
        self.H=H
        self.m=m
        self.ans=0
        self.visited=[[False]*W for _ in range(H)]
    def trav(self,x,y):
        #print(x,y)
        self.visited[x][y]=True
        self.ans+=1
        offset=[(-1,0),(0,-1),(1,0),(0,1)]
        for dx,dy in offset:
            x2=x+dx
            y2=y+dy
            if 0<=x2<self.H and 0<=y2<self.W and self.m[x2][y2]=='.' and self.visited[x2][y2]==False:
                self.trav(x2,y2)
    

while True:
    W,H=map(int,input().split())
    if not (W and H): break
    m=[]
    for i in range(H):
        L=list(input())
        if '@' in L:
            (sx,sy)=(i,L.index('@'))
        m.append(L)
    D=dfs(W,H,m)
    D.trav(sx,sy)
    print(D.ans)

Python: def dfs(tiles, w, h, x, y):
    cnt = 1
    tiles[y][x] = '@'
    for dx,dy in ((0,1), (0,-1), (-1,0), (1,0)):
        if 0<=x+dx<w and 0<=y+dy<h and tiles[y+dy][x+dx]=='.':
            cnt += dfs(tiles, w, h, x+dx, y+dy)
    return cnt

def main():
    while True:
        W,H = [int(x) for x in input().split()]
        if W==0 and H==0:
            exit()
        tiles = [[c for c in input()] for h in range(H)]
        for i in range(H):
            if '@' in tiles[i]:
                Y = i
                X = tiles[i].index('@')
        answer = dfs(tiles, W, H, X, Y)
        print(answer)

if __name__ == '__main__':
    main()

Python: import math

def search(w,h,data): 
    for i in range(h):
        if '@' in data[i]:
            stx,sty = i,data[i].index('@')

    stack = [[stx,sty]]
    check = [[stx,sty]]
    while True:
        if len(stack) != 0:
            s = stack[-1]
            Hnow,Wnow = s[0],s[1]
        else:
            return len(check)

        stack.pop()
        
        if Hnow < h-1:
            if (data[Hnow+1][Wnow] == '.') and ([Hnow+1,Wnow] not in check):
                stack.append([Hnow+1,Wnow])
                check.append([Hnow+1,Wnow])

        if Wnow < w-1:
            if (data[Hnow][Wnow+1] == '.') and ([Hnow,Wnow+1] not in check):
                stack.append([Hnow,Wnow+1])
                check.append([Hnow,Wnow+1])

        if Hnow > 0:
            if (data[Hnow-1][Wnow] == '.') and ([Hnow-1,Wnow] not in check):
                stack.append([Hnow-1,Wnow])
                check.append([Hnow-1,Wnow])

        if Wnow > 0:
            if (data[Hnow][Wnow-1] == '.') and ([Hnow,Wnow-1] not in check):
                stack.append([Hnow,Wnow-1])
                check.append([Hnow,Wnow-1])

a = []


while True:
    w,h = list(map(int,input().split()))
    if (w == 0)and(h == 0):
        break
    else:
        data = [list(input()) for l in range(h)]
        a.append(search(w,h,data))

for i in a:
    print(i)

Python: """
1. スタート地点の座標を取得
2. スタート地点からbfsをして到達可能な”.”の数を数える
"""

from collections import deque

def bfs(h, w, f, s):
    count = 1
    q = deque()
    q.append(s)

    move = ((0, 1), (0, -1), (1, 0), (-1, 0))

    while q:
        i, j = q.popleft()

        for di, dj in move:
            ni , nj = i + di, j + dj
            if 0 <= ni < w and 0 <= nj < h and f[ni][nj] == ".":
                count += 1
                q.append((ni, nj))
                f[ni][nj] = "#"

    return count

def search_atmark(h, w, f):
    for i in range(h):
        for j in range(w):
            if f[i][j] == "@":
                return (i, j)

def solve(h, w, f):
    s = search_atmark(w, h, f)
    return bfs(h, w, f, s)

if __name__ == '__main__':
    while(True):
        w, h = map(int, input().split())
        if w == 0 and h == 0:
            break

        f = [list(input()) for i in range(h)]
        print(solve(w, h, f))