#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define N 105
using namespace std;
int m,n;
char map[N][N];
int ans;
int visited[N][N];
void dfs(int i,int j)
{
if(i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || map[i][j] == '*')//终止条件:①走到边界了②已经走过了③不是符号@
return ;
visited[i][j] = 1;
dfs(i+1,j);//在每一个点处都有八个方向可以走 其中八个方向可以通过一个二重循环来代替(见《算法入门经典》P163)
dfs(i-1,j);
dfs(i,j-1);
dfs(i,j+1);
dfs(i+1,j+1);
dfs(i-1,j-1);
dfs(i-1,j+1);
dfs(i+1,j-1);
}
int main()
{
//freopen("E:\\in.txt","r",stdin);
//freopen("E:\\out.txt","w",stdout);
while(cin>>m>>n)
{
if(!m) break;
memset(map,0,sizeof(map));
memset(visited,0,sizeof(visited));
ans=0;
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
cin>>map[i][j];
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
if(!visited[i][j] && map[i][j] == '@')
{
ans++;
dfs(i,j);
}
cout<<ans<<endl;
}
return 0;
}
UVa 572 Oil Desposits (dfs 图 染色 八连通种子填充)
最新推荐文章于 2023-02-10 23:56:08 发布