题意
题目很简单,就是求给张图,求联通分量,节点可以和周围八个方向联通。例:
分析
每次遍历找到一个@,以这个为起点,dfs一下将联通的点 都标记为#,知道遍历找不出@,输出dfs的次数就是联通分量
#include<bits/stdc++.h>
using namespace std;
const int N = 100 + 10;
const int INF = 0x3f3f3f3f;
int dir[8][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};
char a[N][N];
int vis[N][N];
int n, m;
bool g(int x, int y)
{
if(x < 0 || y < 0 || x >= n || y >= m){
return false;
}
return true;
}
void dfs(int x, int y)
{
for(int i = 0; i < 8; i++){
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(g(xx, yy) && !vis[xx][yy] && a[xx][yy] == '@'){
a[xx][yy] = '#';
vis[xx][yy] = 1;
dfs(xx, yy);
}
}
}
int main()
{
while(cin >> n >> m){
if(n == 0 && m == 0)
break;
memset(a, 0, sizeof(a));
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; i++){
scanf("%s", a[i]);
}
int x = 0, y = 0;
int cnt = 0;
for(int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if(a[i][j] == '@'){
a[i][j] = '#';
dfs(i, j);
cnt++;
}
}
}
cout << cnt << endl;
}
return 0;
}