题目相关

题目链接

计蒜客,https://nanti.jisuanke.com/t/T1414。

我的 OJ,http://47.110.135.197/problem.php?id=4768。

题目描述

蒜头君以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。已知图中除了黑线上的点外,图像中没有纯黑色(即像素为 0 的点)。

输入格式

第一行输入测试数据的组数 N(0<N≤10)。

每组测试数据的第一行是两个个整数 W,H 分表表示图片的宽度和高度 (3≤W≤1440,3≤H≤960)。

随后的 H 行,每行有 W 个正整数,表示该点的像素值。(像素值都在 0 到 255 之间,0 表示黑色,255 表示白色)。

输出格式

以矩阵形式输出把黑色框之外的区域变黑之后的图像中各点的像素值。

输入样例

1
5 5
100 253 214 146 120
123 0 0 0 0
54 0 33 47 0
255 0 0 78 0
14 11 0 0 0

输出样例

0 0 0 0 0
0 0 0 0 0
0 0 33 47 0
0 0 0 78 0
0 0 0 0 0

题目分析

题意分析

就是在一个 H*W 的矩阵内将 0 围成的区域外面的非零变成零。

以前我们 BFS 都是找零围成的区域,换一个角度考虑,本题其实就是找零外面非零的数据。那么本题和洛谷涂颜色其实很像,就是反过来罢了。

因此,可以参考涂颜色这题的方案,在外围加上一层,只是本层不是零,而是非零。然后再从 (0,0) 开始进行 BFS 所有非零的区域。

更详细的题解报考可以参考我以前写过的涂颜色,https://blog.csdn.net/justidle/article/details/104764162。

因此本题的核心变为,在外围加上一层非零数据,将矩阵从 H*W 大小变为 (H+1)*(W+1) 的大小。

AC 参考代码

由于本题比较特殊,因此可以不需要可见性控制,我们通过将 data 设置为 0,表示访问控制。

使用 BFS

#include <iostream>
#include <queue>
#include <cstring>using namespace std;const int MAXW = 1444;
const int MAXH = 964;typedef struct _MAZE {int w, h;int data[MAXH][MAXW];
} MAZE;MAZE maze;typedef struct _POS {int x,y;
} POS;//x,y表示起点位置
void bfs(int x, int y) {queue<POS> q;//从0,0开始遍历POS cur={x,y};maze.data[x][y]=0;q.push(cur);POS next;const POS moves[] = {{-1,0},{0,-1},{1,0},{0,1}};while (false==q.empty()) {cur = q.front();q.pop();for (int i=0; i<4; i++) {next.x = cur.x+moves[i].x;next.y = cur.y+moves[i].y;if (next.x>=0 && next.x<=maze.h+1 &&next.y>=0 && next.y<=maze.w+1 &&maze.data[next.x][next.y]>0) {maze.data[next.x][next.y]=0;q.push(next);}}}
}int main() {int n;cin >> n;for (int i=0; i<n; i++) {memset(maze.data, 1, sizeof(maze.data));cin>>maze.w>>maze.h;for (int j=1; j<=maze.h; j++) {for (int k=1; k<=maze.w; k++) {cin>>maze.data[j][k];}}bfs(0, 0);//输出for (int j=1; j<=maze.h; j++) {for (int k=1; k<=maze.w; k++) {cout << maze.data[j][k] << " ";}cout << endl;}}return 0;
}

使用 DFS

#include <iostream>
#include <queue>
#include <cstring>using namespace std;const int MAXW = 1444;
const int MAXH = 964;typedef struct _MAZE {int w, h;int data[MAXH][MAXW];
} MAZE;MAZE maze;typedef struct _POS {int x,y;
} POS;void dfs(int x, int y) {const POS moves[] = {{-1,0},{0,-1},{1,0},{0,1}};int xx, yy;for (int i=0; i<4; i++) {xx = x+moves[i].x;yy = y+moves[i].y;if (xx>=0 && xx<=maze.h+1 &&yy>=0 && yy<=maze.w+1 &&maze.data[xx][yy]>0) {maze.data[xx][yy]=0;dfs(xx, yy);}}
}int main() {int n;cin >> n;for (int i=0; i<n; i++) {memset(maze.data, 1, sizeof(maze.data));cin>>maze.w>>maze.h;for (int j=1; j<=maze.h; j++) {for (int k=1; k<=maze.w; k++) {cin>>maze.data[j][k];}}maze.data[0][0]=0;dfs(0, 0);//输出for (int j=1; j<=maze.h; j++) {for (int k=1; k<=maze.w; k++) {cout << maze.data[j][k] << " ";}cout << endl;}}return 0;
}

BFS 和 DFS 区别

这类题目最好是使用 BFS。如果使用 DFS,当数据量比较大的时候,DFS 的递归可能导致爆栈。一般来说,当递归深度超过2500 层后,DFS 容易爆栈。

总结

连通性查找问题的结题思路是使用 BFS 或者查并集。而不是使用 DFS。

计蒜客题解——T1414:抠图相关推荐

  1. 计蒜客题解——T1214:鸣人和佐助

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1214. 题目描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到 ...

  2. 计蒜客题解——T1213:拯救行动

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1213. 题目描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用 N×M(N,M≤200) 的矩阵来表 ...

  3. 计蒜客题解——T1769:最大岛屿

    题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1405. 我的OJ,http://47.110.135.197/problem.php?id=5254. 题目 ...

  4. 计蒜客题解——T1244:单词序列

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1244. 我的 OJ,http://47.110.135.197/problem.php?id=4766 ...

  5. 计蒜客题解——最大的余数

    其实本题的难度真心不高,但是可以完整说明数据分析.标程.随机数生成.对拍等部分. 题目链接 原题来自计蒜客的某次比赛.计蒜客对应的链接为https://nanti.jisuanke.com/t/422 ...

  6. 计蒜客题解——T1157:派

    题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1157. 我的OJ,http://47.110.135.197/problem.php?id=4951. 题目 ...

  7. 计蒜客题解-T1260宗教信仰

    题目概况 链接: https://nanti.jisuanke.com/t/T1260 难度: 普及/提高-(计蒜客评级普及T3,个人评价T2) 题目分析 简化题目: 有几群人,分别信仰不同的宗教,有 ...

  8. 计蒜客2020蓝桥杯大学A组模拟赛题解

    计蒜客2020蓝桥杯大学A组模拟赛题解 蓝桥杯的话,去年拿了C++组的国二.今年报名了新成立的Python组,不知道能不能摸到国一的鱼 模拟赛链接如下: https://www.jisuanke.co ...

  9. 计蒜客一月入门赛:《三个火枪手》题解

    题目链接(https://nanti.jisuanke.com/t/52314) 有 n 个人,其中有 m 对相互认识的关系. 一个人的知名度定义为 有多少人 和他相互认识. 现在蒜头君需要从这 n ...

最新文章

  1. TCP和UDP传输特点
  2. 基于 HTML5 的 WebGL 技术构建 3D 场景(一)
  3. numpy数组如何将数组中的元素批量保留小数(或精确到指定位)?np.around()函数(与np.round()函数等价?)
  4. map内置函数分析所得到的思路
  5. JavaScript的JSON转变函数parse[转化为对象] stringfy[转化为字符串]
  6. webpack vue-cli 一有空格和分号就报错
  7. python判断字符大小写转换_Python 字符串大小写转换的简单实例
  8. Array.prototype.slice.call 将伪数组转成真数组的原理是什么?
  9. String 创建对象问题
  10. ug装配绕轴旋转_UG绘制小吊扇模型,建模装配还能运动起来
  11. UML类图关系全面剖析[转]
  12. 容量管理体系建设实践
  13. 【游戏技术】建造防守 Build and Defense
  14. 如何调整gif动图的速度?1分钟在线调节gif动图速度
  15. django 数据库配置
  16. win10系统添加打印机
  17. 我国知识共享数学生态圈的发端历程
  18. github开源:企业级应用快速开发框架CIIP WEB+WIN+移动端
  19. 自己整理mysql语句
  20. 【模拟】【NOIP2008】笨小猴 word

热门文章

  1. SQLSERVER 多表联合查询(join)
  2. 关于正当防卫的几个案例分析
  3. 企业无线路由器故障排除实例解析
  4. 树莓派利用python控制57步进电机
  5. linux如何查看本地yum源地址,CentOS配置本地yum源
  6. 一种适用于智能仪表智能特性验证的检测方法和系统
  7. axure没有团队页签_使用Axure管理团队项目以及分享原型
  8. linux 查询文件大小大于1g_常用Linux命令
  9. Java 原生实现 URL Decode 功能(从 Byte 字节数组转 Unicode 字符)
  10. 【leetcode】【简单】13. 罗马数字转整数【字典搜索】