用dfs求联通块(UVa572)
2024-10-11 04:08:36
一、题目
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符所在的格子相邻(横、竖、或者对角线方向),就说它们属于同一个八连块。
二、解题思路
和前面的二叉树遍历类似,图也有DFS和BFS遍历。由于DFS更容易编写,一般用DFS找联通块:从每个“@”格子出发,递归遍历与之相邻的“@”格子,标记相同的“联通分量标号”。这样在访问之前需检查它是否已经有了编号,从而避免一个格子访问多次。
三、代码实现
#include<stdio.h>
#include<iostream>
using namespace std; const int maxn = + ;
char field[maxn][maxn];
int N, M; void dfs(int x, int y)
{
field[x][y] = '*'; //这里通过把“@”换成“*”,从而避免重复
for (int dx = -; dx <= ; dx++)
for (int dy = -; dy <= ; dy++)
{
int nx = x + dx; int ny = y + dy;
if (nx >= && nx < N && ny >= && ny < M && field[nx][ny] == '@')
dfs(nx, ny);
}
return;
}
void slove()
{
int res = ;
for (int i = ; i < N; i++)
for (int j = ; j < M; j++)
{
if (field[i][j] == '@')
{
dfs(i, j);
res++; //遍历完一个连通分量,答案加一
}
}
printf("%d\n", res);
}
int main()
{
while (scanf("%d%d", &N, &M) == && N)
{
for (int i = ; i < N; i++)
for (int j = ; j < M; j++)
cin >> field[i][j]; slove();
}
return ;
}
最新文章
- LINQ to SQL语句(18)之运算符转换
- Android系统中应用的安装和卸载的监听
- 误删/usr文件夹解决办法
- 作业七:团队项目——Alpha版本冲刺阶段-11
- .NET Core第三方开源Web框架YOYOFx
- FlyCapture2 Qt5 MinGW Configuration
- Request 接收参数乱码原理解析
- C#字符串与char数组互转!
- 动软代码生成器 可用于生成Entity层,可更改模板 /codesmith 也可以
- 论山寨手机与Android 【11】移动网络规范的合纵连横
- hdu1565+hdu1569(最大点权独立集)
- POJ培训计划2253_Frogger(最短/floyd)
- MATLAB符号极限、导数及级数求和
- WeakHashMap和Java引用类型详细解析
- pyv8安装
- BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
- jacascript 立即执行函数(IIFE)与闭包
- Java MD5加密与RSA加密
- Jmeter Thread Group中如果存在HTTP request执行失败,就对整个Thread Group重新执行,限定最大执行次数N次
- constructor属性解析