C++ 数据结构之水洼的数量算法

发布时间 - 2026-01-11 02:02:29    点击率:

C++ 数据结构之水洼的数量算法

题目: 有一个大小为N*M的园子, 雨后起了积水. 八连通的积水被认为是连接在一起的. 请求出园子里总共有多少水洼.

使用深度优先搜索(DFS), 在某一处水洼, 从8个方向查找, 直到找到所有连通的积水. 再次指定下一个水洼, 直到没有水洼为止.
则所有的深度优先搜索的次数, 就是水洼数. 时间复杂度O(8*M*N)=O(M*N).

代码:

/* 
 * main.cpp 
 * 
 * Created on: 2014.7.12 
 *本栏目更多精彩内容:http://www.bianceng.cn/Programming/sjjg/
 *   Author: spike 
 */
   
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 
   
class Program { 
  static const int MAX_N=20, MAX_M=20; 
  int N = 10, M = 12; 
  char field[MAX_N][MAX_M+1] = { 
      "W........WW.", 
      ".WWW.....WWW", 
      "....WW...WW.", 
      ".........WW.", 
      ".........W..", 
      "..W......W..", 
      ".W.W.....WW.", 
      "W.W.W.....W.", 
      ".W.W......W.", 
      "..W.......W."}; 
  void dfs(int x, int y) { 
    field[x][y] = '.'; 
    for (int dx = -1; dx <= 1; dx++) { 
      for (int dy = -1; dy <= 1; dy++) { 
        int nx = x+dx, ny = y+dy; 
        if (0<=dx&&nx<N&&0<=ny&&ny<=M&&field[nx][ny]=='W') dfs(nx, ny); 
      } 
    } 
    return; 
  } 
public: 
  void solve() { 
    int res=0; 
    for (int i=0; i<N; i++) { 
      for (int j=0; j<M; j++) { 
        if (field[i][j] == 'W') { 
          dfs(i,j); 
          res++; 
        } 
      } 
    } 
    printf("result = %d\n", res); 
  } 
}; 
   
   
int main(void) 
{ 
  Program P; 
  P.solve(); 
  return 0; 
}

输出:

result = 3

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# 数据结构之水洼的数量算法  # 数据结构  # 水洼数量  # C++数据结构与算法之哈夫曼树的实现方法  # C++数据结构与算法之反转链表的方法详解  # C++数据结构与算法之双缓存队列实现方法详解  # C++ 数据结构之kmp算法中的求Next()函数的算法  # C++数据结构与算法之判断一个链表是否为回文结构的方法  # C++ 冒泡排序数据结构、算法及改进算法  # C++数据结构与算法的基础知识和经典算法汇总  # 求出  # 有多少  # 希望能  # 谢谢大家  # 本栏目  # 雨后  # 有一个  # 在某一  # 园子里  # cn  # bianceng  # www  # spike  # http  # lt  # include  # Author  # Programming  # sjjg 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: MySQL查询结果复制到新表的方法(更新、插入)  如何在IIS服务器上快速部署高效网站?  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  如何用景安虚拟主机手机版绑定域名建站?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  利用vue写todolist单页应用  如何有效防御Web建站篡改攻击?  Laravel集合Collection怎么用_Laravel集合常用函数详解  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  javascript中的try catch异常捕获机制用法分析  如何在Ubuntu系统下快速搭建WordPress个人网站?  网页设计与网站制作内容,怎样注册网站?  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  高端云建站费用究竟需要多少预算?  浅谈redis在项目中的应用  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  如何用腾讯建站主机快速创建免费网站?  javascript基于原型链的继承及call和apply函数用法分析  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  深圳网站制作的公司有哪些,dido官方网站?  如何安全更换建站之星模板并保留数据?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  微信小程序 HTTPS报错整理常见问题及解决方案  iOS中将个别页面强制横屏其他页面竖屏  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  如何自定义建站之星网站的导航菜单样式?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  高端网站建设与定制开发一站式解决方案 中企动力  历史网站制作软件,华为如何找回被删除的网站?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  如何在万网ECS上快速搭建专属网站?  如何快速登录WAP自助建站平台?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何自定义分页视图?(Pagination示例)  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何用低价快速搭建高质量网站?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何用AWS免费套餐快速搭建高效网站?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  微信小程序 配置文件详细介绍