题目
注意多组输入,要清空数组和计数置零

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cstring>
using namespace std;
char arr[23][23];
int x,y,cnt;

void dfs(int u,int v){
	if(u<0||u>=x||v<0||v>=y||arr[u][v]=='#') return;
	arr[u][v]='#';
	cnt++;
	dfs(u,v-1);
	dfs(u,v+1);
	dfs(u-1,v);
	dfs(u+1,v);
}
int main(){
	while(scanf("%d%d",&y,&x)!=EOF){
		if(x==0&&y==0) break;
		cnt=0;
		memset(arr,0,sizeof(arr));
		int starti=0,startj=0;
		for(int i=0;i<x;i++){
			for(int j=0;j<y;j++){
				cin>>arr[i][j];
				if(arr[i][j]=='@'){
					starti=i;
					startj=j;
				}
			}
		}
		dfs(starti,startj);
		cout<<cnt<<endl;
	}
	
	return 0;
} 

又一版本

//需要注意的问题,读入字符时,要注意用getchar清除掉换行符 
//#include<bits/stdc++.h> //重大OJ不能使用万能头文件 
#include<cstdio>
#include<cstring>
using namespace std;
char matrix[25][25];
int m,n;
int dfs(int x, int y){
	if(x<0||x>=m||y<0||y>=n||matrix[x][y]=='#') return 0;
	matrix[x][y]='#';
	return 1+dfs(x+1,y)+dfs(x-1,y)+dfs(x,y+1)+dfs(x,y-1);
}
int main(){

	while(scanf("%d%d",&n,&m)){ //m和n是反着写的 
		if(m==0&&n==0) return 0;
		int a,b;
		memset(matrix,0,sizeof(matrix));
		getchar();
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				scanf("%c",&matrix[i][j]);
				if(matrix[i][j]=='@'){
					a=i;
					b=j;
					matrix[i][j]='.';
				}
			}
			getchar();
		}
		printf("%d\n",dfs(a,b));
	} 
	return 0;
}