简单DFS,也可以用记忆化搜索,下面附上用DFS的代码:
#include<cstdio>
#include<iostream>
using namespace std;
int w,h;
int tmap[1000][1000];
int sum;
void dfs(int x,int y){
tmap[x][y] = 1;
for(int nx = -1;nx<=1;nx++){
int dx = nx+x;
if(0<=dx&&dx<h && tmap[dx][y]==0){
sum++;
dfs(dx,y);
}
}
for(int ny = -1;ny<=1;ny++){
int dy = ny+y;
if(0<=dy&&dy<w && tmap[x][dy]==0){
sum++;
dfs(x,dy);
}
}
return ;
}
int main(void){
//freopen("1979.in","r",stdin);
int x,y;
while(1){
cin>>w>>h;
if(w == 0 && h == 0) break;
for(int i = 0;i<h;i++){
for(int j = 0;j<w;j++){
char tmp;
cin>>tmp;
if(tmp == '.'){
tmap[i][j] = 0;
}else if(tmp == '#'){
tmap[i][j] = 1;
}else if(tmp == '@'){
tmap[i][j] = 1;
x = i;
y = j;
}
}
}
dfs(x,y);
/*
for(int i = 0;i<h;i++){
for(int j = 0;j<w;j++){
cout<<tmap[i][j];
}
cout<<endl;
}
*/
cout<<sum+1<<endl;
sum = 0;
}
return 0;
}