您的位置:首页 > 其它

岛屿数量问题(用广度优先算法)

2020-02-16 18:05 127 查看

广度优先算法是一种使用队列遍历所有节点状态的算法,

根节点放入队列,

然后拿出队列中第一个节点

获得该节点所有未被访问过得后续节点存入队列

当队列为空,则遍历结束。

岛屿数量问题是给一个nxm的二维数组,获得四周都是水的岛屿数量,1代表土地,0代表海水

代码如下:

[code]bfs.h
#pragma once
#include<iostream>
typedef struct position
{
int x;
int y;
}pos;
[code]bfs.c
#include"BFS.h"//岛屿数量
#include"queue"

//思路,相连节点放入队列,
bool visited[5][5] = {false};   //被访问标识
int map[5][5];   //地图5x5
int count = 0;
int main()
{
std::queue<pos> q;  //

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
scanf_s("%d",&map[i][j]); //输入地图
}
}

for (int m = 0; m < 5; m++)
{
for (int n = 0; n < 5; n++)
{
if (visited[m]
 != true && map[m]
 == 1)
{
visited[m]
 = true;
pos x = { m,n };
q.push(x);
while (!q.empty())//队列不为空就循环
{

int e = q.front().x;
int f = q.front().y;
if (e - 1 >= 0)
{
if (visited[e - 1][f] != true)
{
visited[ e- 1][f] = true;
if (map[e - 1][f] == 1)
{
pos a = { e - 1,f };
q.push(a);
}
}
}
if (e + 1 < 5)
{
if (visited[e + 1][f] != true)
{
visited[e + 1][f] = true;
if (map[e + 1][f] == 1)
{
pos b = { e + 1,f };
q.push(b);
}
}
}
if (n - 1 >= 0)
{
if (visited[e][f - 1] != true)
{
visited[e][f - 1] = true;
if (map[e][f - 1] == 1)
{
pos c = { e,f - 1 };
q.push(c);
}
}
}
if (n + 1 < 5)
{
if (visited[e][f + 1] != true)
{
visited[e][f + 1] = true;
if (map[e][f + 1] == 1)
{

pos d = { e,f + 1 };
q.push(d);
}
}
}
q.pop();
}
count++;
}
}
}

printf("%d",count);
system("pause");
return 0;
}

广度优先算法经常被用作计算最短路径。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
平罗勒斯第四维度 发布了10 篇原创文章 · 获赞 0 · 访问量 973 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: