Description
多组案例,每组案例输入一个m行n列的字符矩阵,统计字符‘@’组成多少个连通块。如果两个字符‘@’所在的格子相邻(横、竖或对角线),则说明它们属于同一连通块。
Input
输入行n列m,接下来输入地图,n和m为0结束输入。
Output
输出有几个联通快,斜着联通也算是一个联通快。
Solution
DFS板题。
#include <iostream>
using namespace std;
int LINE, COL;
char mapOil[200][200];
bool visit[200][200];
int COUNT = 0;
void dfs(int i, int j)
{
if (i < 0 || i >= LINE || j < 0 || j >= COL)
return;
for (int x = -1; x <= 1; x++)
{
for (int y = -1; y <= 1; y++)
{
if ((x != 0 || y != 0) && mapOil[i + x][j + y] == '@' && visit[i + x][j + y] == false)
{
visit[i + x][j + y] = true;
dfs(i + x, j + y);
}
}
}
}
void init()
{
for (int i = 0; i < 200; i++)
for (int j = 0; j < 200; j++)
mapOil[i][j] = '*', visit[i][j] = false;
COUNT = 0;
}
int main()
{
// freopen("in.txt", "r", stdin);
while (~scanf("%d%d", &LINE, &COL) && (LINE || COL))
{
init();
for (int i = 0; i < LINE; i++)
scanf("%s", mapOil[i]);
for (int i = 0; i < LINE; i++)
{
for (int j = 0; j < COL; j++)
{
if (mapOil[i][j] == '@' && visit[i][j] == false)
{
COUNT++;
visit[i][j] = true;
dfs(i, j);
}
}
}
printf("%d\n", COUNT);
}
return 0;
}