题目大意:有一片n*m区域,其中@表示有油,*表示没有油,@的周围八个格子如果有油,就说明他们属于同一块油田。现在给你一个图,问你有几块油田。
题目分析:八连块问题,要注意边界和字符串的处
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 200
char map[maxn][maxn];
int vis[maxn][maxn];
int n,m;
int co;
void dfs(int i,int j){
if(vis[i][j]==1||map[i][j]=='*'||i<=0||j<=0||i>n||j>m)
return;//避免越界,vis为标记数组
else{
vis[i][j]=1;//不要忘记标记
dfs(i-1,j-1);dfs(i-1,j);dfs(i-1,j+1);
dfs(i,j-1); dfs(i,j+1);
dfs(i+1,j-1);dfs(i+1,j);dfs(i+1,j+1);
}
}
int main(){
int i,j;
char s[200];
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
co =0;
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));//初始化为0,代表都没有访问过
for(i=0;i<n;i++){
scanf("%s",s);
for(j=0;j<m;j++)
map[i+1][j+1]=s[j];//周围空出一圈格子,避免越界。
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
if(map[i][j]=='@'&&vis[i][j]==0){
dfs(i,j);
co++;
}
}
printf("%d\n",co);
}
return 0;
}
理,避免越界。