题意:给你一个二维数组,输出有几块油田,由样例可知,八个方向只要相连,就算是一个油田,所有八个方向都要搜索到。
#include<stdio.h>
#define MAXN 150
char s[MAXN][MAXN];
int move[8][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {-1, 1}, {1, -1}, {-1, -1}};
int m, n, k, ans;
void dfs(int x, int y){
for(int i = 0; i < 8; i++){ //依次扫描八个方向,寻找可行点
int tx = x + move[i][0];
int ty = y + move[i][1];
if(tx >= 0 && tx < m && ty >= 0 && ty < n && s[tx][ty]=='@'){ //判断是否超出地图边界和是否可行
s[tx][ty] = '*'; //标记已经走过的点
dfs(tx, ty);
}
}
}
int main()
{
while(scanf("%d%d", &m, &n) && m+n){
ans = 0;
for(int i = 0; i < m; i++)
scanf("%s", s[i]);
for(int i = 0; i < m; i++){ //分别以每个点为起点扫描一次,判断联通分量个数即可
for(int j = 0; j < n; j++){
if(s[i][j]=='@'){ //直接忽略掉没有油田的点
s[i][j] = '*'; //标记该点已经走过
ans++;
dfs(i, j);
}
}
}
printf("%d\n", ans);
}
return 0;
}