岛屿数量问题(深度优先)
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; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- DEV-C++支持C99标准设置方法
- 详解socket编程:bind()函数为什么要使用地址类型转化传递参数?
- fedora等linux虚拟机,虚拟机识别了u盘,但在linux系统里却无法找到u盘文件夹
- 国密算法SM4-PHP实现
- C走迷宫源文件,建议使用Dev-C++编译
- 制作坑人的多层文件夹(使用批处理文件)
- 错误:AttributeError: module 'easygui' has no attribute 'msgbox'
- vue.js循环加载图片资源及其他
- 如何用一次循环得到数组中第二大数
- 使用map删除字符串的交集
- Git学习笔记(一)
- Git学习笔记(二)
- Git学习笔记(三)
- scikit-learn机器学习常用算法原理及编程实战(一)
- scikit-learn机器学习常用算法原理及编程实战(二)
- scikit-learn机器学习常用算法原理及编程实战(五)
- Deep Residual Learning for Image Recognition
- JetBrains系列软件用法
- PHP Tips
- wechall writeup