题目描述
DFS 做法书里有写, 这里不再贴出代码
BFS 做法: 手写队列
代码示例
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1001;
char a[maxn][maxn]; // 存储元素, 以字符存储
int vis[maxn][maxn]; // 记录元素是否被访问
int n, m;
int d[4][2] = {{-1, 0},{1,0},{0,-1},{0,1}}; // 方向数组
struct node
{
int x;
int y;
}q[maxn]; // 结构体队列
void bfs(int x, int y)
{
int head = 1; int tail = 1;
q[tail].x = x;
q[tail].y = y; // 当前点入列
tail ++; // 队尾指针++
while(head < tail) // 队列不为空
{
int x0 = q[head].x;
int y0 = q[head].y;
vis[x0][y0] = 1; // 队首元素访问标记
for(int i = 0; i < 4; i++) // 访问四个方向的邻居元素
{
int xn = x0 + d[i][0];
int yn = y0 + d[i][1];
if(xn >= 0 && xn < n && yn >= 0 && yn < m && a[xn][yn] != '0' && vis[xn][yn] != 1 )
{
q[tail].x = xn; // 满足条件入列
q[tail].y = yn;
vis[xn][yn] = 1; // 入列元素标记为已访问
tail ++; // 队尾指针后移
}
}
head ++; // 队首出列
}
}
int main()
{
cin >> n >> m;
int cnt = 0; // 统计个数
memset(vis, 0, sizeof(vis)); // 访问标记清零
for (int i = 0; i < n; i ++)
cin >> a[i]; // 每一行作为一个字符列表存入
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
if(a[i][j] != '0' && !vis[i][j]) // 当前元素不是数字 0 且未被访问
{
cnt ++;
bfs(i, j); //以当前点为起点进行广搜
}
}
cout << cnt ; // 输出结果
return 0;
}
BFS 有固定模板, 理解记背