题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
一、题目大意:给你一个由 @ 和 * 构成的二维数组,连续的 @ 可以看做一堆(八个方向),问有多少堆?
二、解题思路:和dfs地图类第2题Counting Sheep 一样的思路,只是改成了八个方向。
#include<iostream>
using namespace std;
#define N 105
char map[N][N];
int dir[8][2]={ {1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1} };
int m,n;
void dfs(int x,int y)
{
map[x][y]='*';
for(int k=0;k<8;k++) //这个地方的 k 只能用 k,绝对不能定义一个全局变量i、j,再使用 i
{
int dx=x+dir[k][0];
int dy=y+dir[k][1];
if(dx>=1 && dx<=m && dy>=1 && dy<=n && map[dx][dy]=='@')
dfs(dx,dy);
}
}
int main()
{
while(scanf("%d%d",&m,&n),m&&n)
{
int i,j,ans=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf(" %c",&map[i][j]); //注意输入的格式
for(i=1;i<=m;i++)
for(j=1;j<=n;j++){
if(map[i][j]=='@'){ //问有几个划分块,
ans++; //从地图左上角开始找,找到一个#就把这连带的块挖出来,变成.
dfs(i,j); //每一个划分块 ans++
}
}
printf("%d\n",ans);
}
return 0;
}