bfs
#include<iostream>
#include<queue>
using namespace std;
const int N=25;
int h,w;
char g[N][N];
int res=1;//初始化为1,表示记数时包括初始位置的瓷砖
int start_i,start_j;
typedef pair<int,int>PII;
int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
void bfs(int x,int y){
queue<PII> q;
q.push({x,y});
while(!q.empty()){
auto now=q.front();
q.pop();
for(int i=0;i<4;i++){
int a=now.first+dx[i],b=now.second+dy[i];
if(a<1||b<1||a>h||b>w) continue;//避免出界
if(g[a][b]=='.'){
g[a][b]='#';
q.push({a,b});
res++;
}
}
}
}
int main(){
while(cin>>w>>h){
if(w==0&&h==0) break;//当在一行中读入的是两个0时,表示输入结束
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cin>>g[i][j];
if(g[i][j]=='@'){
start_i=i,start_j=j;
g[i][j]='#';
}
}
}
bfs(start_i,start_j);
cout<<res<<endl;
res=1;
}
return 0;
}
dfs
#include<iostream>
#include<cstring>
using namespace std;
const int N=25;
int h,w;
char g[N][N];
int start_i,start_j;
int res=1;
int dx[]={0,-1,0,1},dy[]={-1,0,1,0};
void dfs(int x,int y){
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(g[a][b]=='.'){
g[a][b]='#';
res++;
dfs(a,b);
}
}
}
int main(){
while(cin>>w>>h){
if(w==0&&h==0) break;
memset(g,'#',sizeof g);
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cin>>g[i][j];
if(g[i][j]=='@'){
start_i=i,start_j=j;
g[i][j]='#';
}
}
}
dfs(start_i,start_j);
cout<<res<<endl;
res=1;
}
return 0;
}