蒟蒻梦见一片充满宝藏的沙滩, 它是由若干正方形的块状土地组成的一个W*H矩形区域. 蒟蒻决定挖出这片沙滩所有的宝藏,成为传说中的宝藏男孩. 不幸的是,在他挖第二块地时就触发了埋藏其中的地雷,直接炸醒. 他恍然大悟,原来这片沙滩上的每一块地,除了宝藏,还有可能是地雷!
故事没有就这样结束. 第二天,他又做了相同的梦...
编写一个程序,计算出蒟蒻在被炸醒前可能挖到宝藏的最大数量.
Input
输入包含多组数据. 每组数据包含两个正整数W和H.
H表示列数,W表示行数. W和H不超过20.
每块地用字符表示如下:
'.' - 宝藏
'#' - 地雷
'@' - 起点(每组数据中只有一个,下面也有宝藏!)
Output
对于每组数据,输出一个整数,即蒟蒻能挖到宝藏的最大数量。
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
Hint
DFS
#include<cstdio>
#include<queue>
using namespace std;
struct node{
int x,y;
}op;
int w,h,ans;
int vis[25][25],dir[4][2]={1,0,-1,0,0,1,0,-1};
char dt[25][25];
void bfs(){
queue<node> q;
q.push(op);
while(!q.empty()){
node now=q.front(); //当前位置坐标
int bx,by,bn; //下一步的位置
q.pop();
for(int i=0;i<4;i++){
bx=now.x+dir[i][0];
by=now.y+dir[i][1];
if(bx<h&&by<w&&dt[bx][by]=='.'&&!vis[bx][by]){
vis[bx][by]=1;
ans++;
q.push(node{bx,by});
}
}
}
}
int main(){
while(scanf("%d%d",&w,&h)&&w){
ans=1;
for(int i=0;i<h;i++)
for(int j=0;j<w;j++){
scanf(" %c",&dt[i][j]);
vis[i][j]=0;
if(dt[i][j]=='@'){
op.x=i; op.y=j;
vis[i][j]=1;
}
}
bfs();
printf("%d\n",ans);
}
return 0;
}