广搜练习,直接搜索标记走过的路,输出标记的总数即可;
注:代码中的step为记录步,本题中没有用,可不写;
#include<stdio.h>
#include<queue>
using namespace std;
#define N 25
struct node{ //队列,广搜;
int x,y,step;
};
int dir[4][2]={0,1, 0,-1, 1,0,-1,0};
char map[N][N];
int a,b,t;
bool judge(int x,int y)
{
if(x>=0 && x<a && y>=0 && y<b && map[x][y]=='.')
return 1;
return 0;
}
int bfs(int x,int y)
{
queue<node>q;
node cur,next;
int k;
cur.x=x;
cur.y=y;
cur.step=0;
q.push(cur);
map[x][y]='#';
while(!q.empty())
{
cur=q.front();
q.pop();
next.step=cur.step+1;
for(k=0;k<4;k++)
{
next.x=x=cur.x+dir[k][0];
next.y=y=cur.y+dir[k][1];
if(judge(x,y))
{
t++;
map[x][y]='*';
q.push(next);
}
}
}
return -1;
}
int main ()
{
int i,k,x,y,f;
while(scanf("%d%d",&b,&a)!=EOF&&(a||b))
{
f=t=0;
for(i=0;i<a;i++)
{
scanf("%s",map[i]);
for(k=0;k<b&&!f;k++)
if(map[i][k]=='@')
{
f=1;x=i;y=k;break;
}
}
bfs(x,y);
printf("%d\n",t+1);
}
return 0;
}