http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=92

                        图像有用区域

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
 
描述

“ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。

     

图1                                                        图2

已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点)。

 
输入
第一行输入测试数据的组数N(0<N<=6)
每组测试数据的第一行是两个个整数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
来源
[张云聪]原创
上传者
张云聪
开始用的dfs,爆栈了:
#include <bits/stdc++.h>
using namespace std;
int mp[1500][1500];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
int h, w; void dfs(int x, int y){
mp[x][y] = 0;
for(int i = 0; i < 4; i++){
int xx = x + dx[i];
int yy = y + dy[i];
if(xx >= 0 && xx < w && yy >= 0 && yy < h)
if(mp[xx][yy]){
dfs(xx, yy);
}
}
} int main(){
int n;
cin >> n;
while(n--){
cin >> h >> w;
for(int i = 0; i < w; i++){
for(int j = 0; j < h; j++){
cin >> mp[i][j];
}
}
for(int i = 0; i < w; i++){ //由外层边界dfs
for(int j = 0; j < h; j++){
if((i == 0 || j == 0 || i == w - 1 || j == h - 1) && mp[i][j]){
dfs(i, j);
}
}
}
for(int i = 0; i < w; i++){
cout << mp[i][0];
for(int j = 1; j < h; j++){
cout << " " << mp[i][j];
}
cout << endl;
}
} return 0;
}

  后面用了广搜ac:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct node{
int x, y;
};
int mp[1000][1500];
queue <node> myq;
int n, m;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0}; void bfs(int x, int y){
node a;
a.x = x, a.y = y;
myq.push(a);
mp[a.x][a.y] = 0;
while(!myq.empty()){
node b;
b = myq.front();
myq.pop();
int myx = b.x, myy = b.y;
node c;
for(int i = 0; i < 4; i++){
int xx = myx + dx[i];
int yy = myy + dy[i];
if(xx >= 0 && xx <= n + 1 && yy >= 0 && yy <= m + 1){
if(mp[xx][yy]){
mp[xx][yy] = 0;
c.x = xx;
c.y = yy;
myq.push(c);
}
}
}
}
} int main(){
std::ios::sync_with_stdio(false);
int t;
cin >> t;
while(t--){
cin >> m >> n;
memset(mp, 1, sizeof(mp));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> mp[i][j];
}
}
bfs(0, 0);
for(int i = 1; i <= n ; i++){
cout << mp[i][1];
for(int j = 2; j <= m; j++){
cout << " " << mp[i][j];
}
cout << endl;
}
}
return 0;
}

  

36-图像有用区(dfs, bfs)的更多相关文章

  1. ACM 图像有用区域

    图像有用区域 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 “ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以 ...

  2. nyoj 92 图像有用区域

    点击打开链接 图像有用区域 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 "ACKing"同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取 ...

  3. DFS/BFS+思维 HDOJ 5325 Crazy Bobo

    题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...

  4. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  5. ID(dfs+bfs)-hdu-4127-Flood-it!

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...

  6. [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  7. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  8. DFS/BFS视频讲解

    视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...

  9. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

随机推荐

  1. 理解 JavaScript 对象原型、原型链如何工作、如何向 prototype 属性添加新的方法。

    JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板.从原型继承方法和属性.原型对象也可能拥有原型, ...

  2. DECLARE_MESSAGE_MAP用法

    DECLARE_MESSAGE_MAP( ) 说明:  你的程序中的每一个CCmdTarget的派生类都可以提供一个消息映射以处理消息.在你的类声明的末尾使用DECLARE_MESSAGE_MAP宏. ...

  3. ICE的Glacier2使用

    1.使用Glacier2的步骤:   A.编写一个Glacier2的配置文件,参见样例   B.设置Glacier2的访问鉴权(密码或者证书),passwords文件每行样例"test xx ...

  4. NOIP模拟题 栅栏

    题目大意 给定一个$n\times m$的网格图,每次会选择一块矩形沿着网格线铺上栅栏,或者拆除之前铺的栅栏,或者询问两个格子能否不经过栅栏直接到达. 保证栅栏没有重叠或交叉,删去的栅栏删除前一定存在 ...

  5. 【整理】2-SAT

    2-satisfiability,我们一般将其缩写为 2-sat. 了解全名有助于我们对这个算法的理解.     百度翻译:‘satisfiability’---“可满足性,适定性”. “合取范式可满 ...

  6. tableau学习笔记—1

    第一部分 第一章 数据可视化 1.1 用数据讲故事 1.2 数据不只是数字 1.3 在数据中寻找什么(关系.模式.异常) 第二章 Tableau概述 2.1 Tableau概述 2.2 产品简介 第三 ...

  7. swing之borderlayout

    import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; //1.继承 JFrame类 ...

  8. Unity3D for Android 纹理压缩支持

    http://blog.csdn.net/asd237241291/article/details/48548557 首先附图:Unity3D for Android支持的纹理压缩格式 纹理压缩可以通 ...

  9. Vue 将样式绑定到一个对象让模板更清晰

    Vue 将样式绑定到一个对象让模板更清晰 <div id="app"> <div v-bind:style="styleObject"> ...

  10. SpringCloud微服务实战——第三章服务治理

    Spring Cloud Eureka 服务治理 是微服务架构中最核心最基本的模块.用于实现各个微服务实例的自动化注册与发现. 服务注册: 在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中 ...