问题链接:HDU-1241
问题简述
有多组数据,每组数据第一行输入两个正整数m,n,下面m行,每行n个字符,字符由‘@’与‘*’组成一个矩形,令‘@’且与此符号相邻(上下左右对角)的‘@’都算为一组,计算共有多少组并输出。
思路
深度优先搜索。
AC通过的C++语言程序如下:
#include<iostream>
#include<cstring>
using namespace std;
char a[101][101];
int a1[100][100];
int s[8][2] = { {0,1},{0,-1},{-1,0},{1,0},{1,1},{1,-1},{-1,1},{-1,-1} };
int m, n;
void DFS(int, int);
int main()
{
while (cin>>m>>n)
{
if (m == 0) break;
for (int i = 0; i < m; i++)
cin >> a[i];
memset(a1, 0, sizeof(a1));
int sum = 0;
for(int i=0;i<m;i++)
for (int j = 0; j < n; j++)
{
if (a[i][j] == '@'&&a1[i][j] == 0)
{
a1[i][j] = 1;
sum++;
DFS(i, j);
}
}
cout << sum << endl;
}
return 0;
}
void DFS(int x, int y)
{
int x1, y1;
for (int i = 0; i < 8; i++)
{
x1 = s[i][0] + x;
y1 = s[i][1] + y;
if (x1<0 || x1>m - 1 || y1<0 || y1>n - 1)
continue;
if (a[x1][y1] == '@'&&a1[x1][y1] == 0)
{
a1[x1][y1] = 1;
DFS(x1, y1);
}
}
}