最主要的是分清楚从一个点遍历到周围的点,并且将遍历过的点做好标记。还有就是弄清楚分界。
#include <iostream>
using namespace std;
char map[105][105];
int n,m;
int dy[10] = {-1,-1,-1,0,0,1,1,1};
int dx[10] = {-1,0,1,-1,1,-1,0,1};
int judge(int x,int y)
{
if(y < 1 || y > m|| x < 1|| x > n)
{
return 0;
}
return 1;
}
void dfs(int x, int y)
{
map[x][y] = -1;
for(int i = 0 ; i < 8; i++)
{
int ty = y + dy[i];
int tx = x + dx[i];
if( judge(tx,ty) == 0)
{
continue;
}
if(map[tx][ty] == '@')
{
dfs(tx,ty);
}
}
}
int main()
{
while(cin>>n>>m && n!= 0 && m!=0)
{
for(int i = 1;i<= n;i++)
{
for(int j = 1 ; j <= m;j++)
{
cin>>map[i][j];
}
}
int sum = 0;
for(int i = 1 ; i <= n;i++)
{
for(int j = 1 ; j <= m;j++)
{
if(map[i][j] == '@')
{
dfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}