分析:挺简单的搜索,用DFS的时候把搜到的点置1,然后统计一下就行了。
Code
#include <iostream>
using namespace std;
int map[22][22];
void DFS(int x,int y)
{
if(map[x][y] == -1 || map[x][y] == 1)
return;
map[x][y] = 1;
DFS(x+1,y);
DFS(x-1,y);
DFS(x,y-1);
DFS(x,y+1);
}
int main()
{
int m,n;
char c;
while(cin>>n>>m,m+n)
{
int x,y;
memset(map,-1,22*22*sizeof(int));
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
cin>>c;
switch(c)
{
case '.': map[i][j] = 0; break;
case '#': map[i][j] = -1; break;
case '@': map[i][j] = 0; x=i;y=j; break;
}
}
DFS(x,y);
int sum=0;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
if(map[i][j] == 1)
++sum;
cout<<sum<<endl;
}
return 0;
}
#include <iostream>
using namespace std;
int map[22][22];
void DFS(int x,int y)
{
if(map[x][y] == -1 || map[x][y] == 1)
return;
map[x][y] = 1;
DFS(x+1,y);
DFS(x-1,y);
DFS(x,y-1);
DFS(x,y+1);
}
int main()
{
int m,n;
char c;
while(cin>>n>>m,m+n)
{
int x,y;
memset(map,-1,22*22*sizeof(int));
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
cin>>c;
switch(c)
{
case '.': map[i][j] = 0; break;
case '#': map[i][j] = -1; break;
case '@': map[i][j] = 0; x=i;y=j; break;
}
}
DFS(x,y);
int sum=0;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
if(map[i][j] == 1)
++sum;
cout<<sum<<endl;
}
return 0;
}