水洼的大小

题目描述:

解法:

1.bfs + dfs
2.二维并查集

思路都差不多,求出每个联通水洼的大小,并做上标记,在输出时上下左右相加就好了。

CODE1:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define INF 0x3f3f3f3f
#define VP vector<pair<int,int> >using namespace std;
const int dx[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};
VP v;//ground
char a[1100][1100];
bool b[1200][1200];
int d[110000];//第i个联通块的大小
int dis[1200][1200];
int n,m,cnt = 0;
void dfs(int,int);//(x,y),sum
int main()
{cin >> n >> m;for(int i = 1;i <= n;++i){getchar();for(int j = 1;j <= m;++j){a[i][j] = getchar();}}for(int i = 1;i <= n;++i){for(int j = 1;j <= m;++j){if(!b[i][j]&&a[i][j] == '.'){++cnt;dfs(i,j);d[cnt] %= 10;//cout << d[cnt] << " ";}}}//cout << endl;for(int i = 1;i <= n;++i){for(int j = 1,x1,x2,y1,y2,sum;j <= m;++j){if(a[i][j] == '*'){x1 = dis[i][j - 1];x2 = dis[i][j + 1];y1 = dis[i - 1][j];y2 = dis[i + 1][j];sum = d[y2] + 1;if(y1 != y2) sum += d[y1];if(x1 != y1&&x1 != y2) sum += d[x1];if(x2 != y2&&x2 != y1&&x2 != x1) sum += d[x2];cout << sum % 10;}else putchar('.');}putchar('\n');}return 0;
}void dfs(int x,int y)
{++d[cnt];//Ë®ÍÝ´óС b[x][y] = true;//±ê¼Ç dis[x][y] = cnt;//ÊôÓÚµÚ¼¸ºÅË®ÍÝ if(!b[x][y - 1]&&a[x][y - 1] == '.') dfs(x,y - 1);if(!b[x - 1][y]&&a[x - 1][y] == '.') dfs(x - 1,y);if(!b[x + 1][y]&&a[x + 1][y] == '.') dfs(x + 1,y);if(!b[x][y + 1]&&a[x][y + 1] == '.') dfs(x,y + 1);
}

CODE2:

#include<cstdio>
#include<queue>
#include<map>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
#define INF 0x3f3f3f3f
#define N 1100
#define x first
#define y second
#define PLL pair<ll,ll>using namespace std;
const int dx[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
ll n,m,d[N][N];
bool ma[N][N],pd[N][N];
PLL fa[N][N];
map<PLL,bool> qc;
inline PLL find1(PLL);
inline void dfs(PLL,PLL);
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> m;for(int i = 1;i <= n;++i){for(int j = 1;j <= m;++j){char c;cin >> c;if(c == '.'){ma[i][j] = 1;d[i][j] = 1;}fa[i][j] = {i,j};}}for(int i = 1;i <= n;++i){for(int j = 1;j <= m;++j){if(ma[i][j]&&!pd[i][j]){pd[i][j] = 1;dfs({i,j},{i,j});}}}for(int i = 1;i <= n;++i){for(int j = 1;j <= m;++j){if(ma[i][j]) cout << '.';else{ll ans = 1;qc.clear();for(int k = 0;k < 4;++k){ll xx = i + dx[k][0];ll yy = j + dx[k][1];PLL r = find1({xx,yy});if(xx < 1||xx > n||yy < 1||yy > m||!ma[xx][yy]) continue;if(qc[r]) continue;qc[r] = 1;ans += d[r.x][r.y];}cout << ans % 10;}}cout << endl;}return 0;
}inline PLL find1(PLL x)
{PLL r = x,t1 = x,t2;while(r != fa[r.x][r.y]) r = fa[r.x][r.y];while(t1 != r){t2 = fa[t1.x][t1.y];fa[t1.x][t1.y] = r;t1 = t2;}return r;
}inline void dfs(PLL x,PLL r)
{for(int i = 0;i < 4;++i){ll xx = x.x + dx[i][0];ll yy = x.y + dx[i][1];if(xx < 1||xx > n||yy < 1||yy > m||!ma[xx][yy]||pd[xx][yy]) continue;d[r.x][r.y]++;pd[xx][yy] = 1;fa[xx][yy] = r;dfs({xx,yy},r);}
}


总结一下,本题主要考察搜索的基本功,思维有深度,还能一题多解,实属一道不错的题。

SSLOJ——P1738.水洼的大小相关推荐

  1. C语言水洼数算法,C++ 数据结构之水洼的数量算法

    C++ 数据结构之水洼的数量算法 题目: 有一个大小为N*M的园子, 雨后起了积水. 八连通的积水被认为是连接在一起的. 请求出园子里总共有多少水洼. 使用深度优先搜索(DFS), 在某一处水洼, 从 ...

  2. android ripple 大小,Android L限制Ripple水波纹范围大小

    Android L限制Ripple水波纹范围大小 Ripple 简介 Android 5.0 之后 google 推出了 Material Design,Botton 默认的触摸反馈会有水波纹涟漪效果 ...

  3. 求水洼的问题——深度优先算法

    解析: 遇到这个题的时候,不太容易快速的想到思路:可能会比较容易想到使用递归的思想: 但是具体怎么写呢? 直接求有几个区域不好求,那么我们换个思路来求,这种题就是这样,直接求不好求,但是当我们转换一下 ...

  4. C语言水洼数算法,水洼的数量算法 代码(C)

    题目: 有一个大小为N*M的园子, 雨后起了积水. 八连通的积水被认为是连接在一起的. 请求出园子里总共有多少水洼. 使用深度优先搜索(DFS), 在某一处水洼, 从8个方向查找, 直到找到所有连通的 ...

  5. 水洼数dfs(java)

    问题描述: 有一个大小为 N×M 的园子,雨后积起了水.八连通的积水被认为是连接在一起的.请求出 园子里总共有多少水洼? *限制条件N, M ≤ 100 样例:输入 N=10, M=12园子如下图 ( ...

  6. 【C++】利用DFS求解水洼数目问题

    题目描述 有一个大小为N x M的园子,雨后积了很多水. 八连通的积水被认为是连接在一起的.(八连通指的是下图中相对.的W部分) 请求出园子里总共有多少个水洼? 八连通的水洼如下所示: W W W W ...

  7. Java 水洼问题 dfs

    深度优先解决水洼问题 有一个大小为 NM 的园子,雨后积起了水.八连通的积水被认为是连接在一起的.请求出园子里总共有多少水洼?(八连通指的是下图中相对 W 的的部分) *** *W* *** 限制条件 ...

  8. 深度搜索—-深度搜索解决矩阵搜索问题(水洼数计算)

    深度搜索--深度搜索解决矩阵搜索问题(水洼数计算) 一.题目 有一个大小为N*M的园子,雨后积起了水.八连通的计税被认为是连接在一起的.请求出园子里总共有多少水洼? (八连通指的是下图中相对w的*的部 ...

  9. UE4 材质笔记之水洼(贴花)

    文章目录 前言 一.实现效果 二.贴花Actor 1.延迟贴花材质的设置 2.水面波纹的设置与插值混合 3. 干湿过度的法线插值 4. 整体湿度与不透明度设置 总结 前言 本笔记是基于<材质完全 ...

最新文章

  1. 微软11月份安全补丁更新 最高级别:重要
  2. mysql插入数据与删除重复记录的几个例子(收藏)
  3. GitHub上个最有意思的项目合集(技术清单系列)
  4. 2021牛客多校1 - Find 3-friendly Integers(数位dp)
  5. 浅淡Kubernetes 与容器技术体系的最佳方法
  6. CSS原理解析之模型篇
  7. 怎么用python编程前二n-1项的等差数列的和_python— 等差数列末项计算方式
  8. MATLAB地图作为底图,Matlab中自带地图绘制WorldMap详解
  9. 阿铭Linux_传统IDC 部署网站学习笔记20190125
  10. iOS 签名机制与证书
  11. BigDecimal类型加减乘除运算(Java必备知识)
  12. discuz X2中template文件夹中模板文件目录
  13. JAVA基础(for语句的统计思想)
  14. 卖旧手机时恢复出厂设置就能不泄露数据?微信官方辟谣了!
  15. android wifi声波连接,声波配网连接wifi(ssid和pwd)
  16. php微信调用摄像头拍视频,公众号调用摄像头录制视频
  17. 网络属性检查和设置-getsockopt()
  18. 陶行知:学生自治问题之研究
  19. 12-integer-to-roman
  20. javaweb校园自行车租赁系统

热门文章

  1. python学习(二)User-Agent
  2. 利用UltrISO将gho文件制作可引导iso
  3. 会议介绍:国际会议级别
  4. 关闭和开启笔记本自带键盘。
  5. 打不死的小强(找实习面试篇)
  6. 面试和谈薪技巧及如何避开常见的陷阱
  7. 商业插画师走尺印象:只为做生活的设计师
  8. Vue——May(1)
  9. if-else语句练习
  10. 手风琴 html 左边,Layui手风琴左边的符号如何修改