您的位置:首页 > 其它

岛屿数量问题(深度优先)

2020-02-16 18:05 99 查看

上个文章写了广度优先的解决方案,实际上用堆栈的方法也能解决

递归本身就是一种系统堆栈,通过每次递归到系统堆栈为0获得一个岛屿的土地遍历。直接上代码。

[code]D_land.h
#pragma once
bool expand(int x, int y);
typedef struct position
{
int x;
int y;

}pos;
[code]D_land.cpp
#include<stdio.h>
#include<vector>
#include"D_land.h"
#define Len 5
//用堆栈实现对岛屿的搜索
int visited[Len][Len] = { 0 };
int map[Len][Len];
int count = 0;
int main()
{
int i, j;
for ( i =0;i < Len;i++)
{
for ( j = 0; j < Len; j++)
{
scanf_s("%d",&map[i][j]);
}

}
std::vector<pos> land;

for (  i = 0; i < Len; i++)
{
for ( j = 0; j < Len; j++)
{
if (map[i][j] == 0||visited[i][j] == 1)
continue;
else
{
count++;
expand(i, j);
}

}

}
printf("岛屿数量:%d",count);
system("pause");
return 0;
}

bool expand(int x, int y)
{
if (visited[x][y] == 1)
return false;
visited[x][y] = 1;  //标记为已访问
for (int dir = 0; dir < 4; dir++)
{
switch (dir)
{
case 0:            //上方
if (y - 1 >= 0)
{
if (visited[x][y - 1] == 0 && map[x][y - 1] == 1)  //未被访问过且是陆地
expand(x, y - 1);
}
break;
case 1:
if (x + 1 < Len)
{
if (visited[x + 1][y] == 0 && map[x + 1][y] == 1)
expand(x + 1, y);
}
break;
case 2:
if (y + 1 < Len)
{
if (visited[x][y + 1] == 0 && map[x][y + 1] == 1)
expand(x, y + 1);
}
break;
case 3:
if (x - 1 >= 0)
{
if (visited[x - 1][y] == 0 && map[x - 1][y] == 1)
expand(x - 1, y);
}
}
}
return true;
}

 

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