题目链接:hdoj 1241
题目翻译:
在一个矩阵里,有些格子是油田,有些不是,相邻(上、下、左、右、左上、右上、左下、右下)的格子如果也是油田,那么他们属于同一块油田,问总共有多少个油田。
该题类似于zoj_2412农场水管问题,不同之处是,对角线相邻的格子也算作一块油田,这样就要在方向数组中增加四行,分别是:
{1,1},{-1,1},{1,-1},{-1,-1},代表右下、左下、右上、左上。
#include <cstdio>
char s[105][105];
int dir[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+dir[i][0];
int ty=y+dir[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))
{
ans=0;
if(m==0 && n==0) break;
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;
}