思路:
1,所有的点标记为新点。
2,二重循环开始搜索 '@',搜索到了就开始dfs,让连通的'@'点都变成旧点。
3,dfs的次数就是连通块数。
注:dfs()此题可以斜着遍历,所以是8个方向,不是4个。
#include <bits/stdc++.h> using namespace std; bool vis[102][102]; char map1[102][102]; int dir[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,-1},{-1,1},{1,-1},}; int n,m; void dfs(int x, int y){ for(int i = 0; i < 8; i++){ int dx = x + dir[i][0]; int dy = y + dir[i][1]; if(dx>=0 && dy>=0 && dx < n && dy < m && map1[dx][dy] == '@' && !vis[dx][dy]){ vis[dx][dy] = true; dfs(dx,dy); } } } int main(){ while(cin>>n>>m && n && m){ getchar(); memset(vis,0,sizeof(vis)); for(int i = 0; i < n; i++) gets(map1[i]); int count = 0; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++){ if(map1[i][j] == '@' && !vis[i][j]) { count++; dfs(i,j); } } cout<<count<<endl; } return 0; }