直接用队列,一路广搜到底。。。
#include <iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
using namespace std;
char a[25][25];
bool vis[25][25];
queue<int> q;
int h,w;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool can(int x,int y)
{
if(x<0||y<0||x>=h||y>=w)
return false;
if(vis[x][y]||a[x][y]!='.')
return false;
return true;
}
int main()
{
// freopen("in.txt","r",stdin);
while(scanf("%d %d",&w,&h)==2&&(w||h))
{
int x;
for(int i=0;i<h;i++)
{
getchar();
for(int j=0;j<w;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='@')
x=i*w+j;
}
}/*
printf("%d\n",x);
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
printf("%c",a[i][j]);
printf("\n");
}*/
memset(vis,0,sizeof(vis));
while(!q.empty()) q.pop();
q.push(x);
int cx,cy;
int s=1;
vis[x/w][x%w]=1;
while(!q.empty())
{
x=q.front();
int px=x/w;
int py=x%w;
q.pop();
for(int i=0;i<4;i++)
{
cx=dir[i][0]+px;
cy=dir[i][1]+py;
if(can(cx,cy))
{
s++;
q.push(cx*w+cy);
vis[cx][cy]=1;
}
}
}
printf("%d\n",s);
}
return 0;
}