裸的DFS。
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1312
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
int fx[5] = {0,0,0,1,-1};
int fy[5] = {0,1,-1,0,0};
char MAP[25][25];
int flag[25][25];
int n,m;
int dfs(int x,int y) {
if(x < 1 || x > n || y < 1 || y > m) return 0;
if(MAP[x][y] == '#') return 0;
if(flag[x][y] == 1 ) return 0;
int ans = 1;
flag[x][y] = 1;
for(int i = 1 ; i <= 4 ; i++) {
ans += dfs(x+fx[i],y+fy[i]);
}
return ans;
}
void Deal_with() {
while(~scanf("%d %d",&m,&n),n+m) {
memset(flag,0,sizeof(flag));
int sx,sy;
for(int i = 1 ; i <= n ; i ++) {
getchar();
for(int j = 1 ; j <= m ; j++) {
scanf("%c",MAP[i]+j);
if(MAP[i][j] == '@') {
sx = i ;
sy = j ;
}
}
}
printf("%d\n",dfs(sx,sy));
}
}
int main(void) {
freopen("a.in","r",stdin);
Deal_with();
return 0;
}