NYOJ—图像有用区域【广搜BFS】
2017-04-12 08:36
106 查看
图像有用区域
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述
“ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点)。
输入
第一行输入测试数据的组数N(0输出
以矩阵形式输出把黑色框之外的区域变黑之后的图像中各点的像素值。样例输入
15 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 00 0 0 0 0
0 0 33 47 0
0 0 0 78 0
0 0 0 0 0
思路
使用广搜,一定要广搜!!一定要广搜!!!!重要的事情说三遍第一眼看见就用深搜了结果一直RE,一直在研究数组是不是会越界,后来想明白了RE的原因是深搜的时候递归调用太多堆栈溢出了,改成bfs就过了.注意坑点 搞清楚w是宽h是高不要用反,搜索的时候需要在外面一圈附上非零的值,为什么要这么做呢 ,如果不再外面一圈附上非零的值的话,下图1 的情况搜索时就无法找到右下脚的一片,经过处理后如图2,则可以找到所有在所画黑框外的像素#include <iostream> #include <stdio.h> #include <cstring> #include <queue> using namespace std; struct zuobiao{ int x,y; }p,k; int t[2000][2000]; int w,h,n; int dir[4][2]={{0,1},{0,-1},{1,0},{ 4000 -1,0}}; queue<zuobiao>q; void bfs(int q_x,int q_y) { while(!q.empty())q.pop(); p.x=q_x; p.y=q_y; q.push(p); while(!q.empty()) { p=q.front(); q.pop(); for(int i=0;i<4;i++) { k.x=p.x+dir[i][0]; k.y=p.y+dir[i][1]; if(k.x>=0&&k.x<=h+1&&k.y>=0&&k.y<=w+1&& t[k.x][k.y]!=0)//在有效范围内且不为0的赋值为0 { t[k.x][k.y]=0; q.push(k); } } } } int main() { int i,j; cin>>n; while(n--) { memset(t,-1,sizeof(t)); //全部刷为-1 cin>>w>>h; for(int i=1;i<=h;i++)//从(1,1)开始储存保证图像外面一圈都为-1 for(int j=1;j<=w;j++) scanf("%d",&t[i][j]); bfs(0,0); for(i=1;i<=h;i++) { for(j=1;j<w;j++) printf("%d ",t[i][j]); printf("%d\n",t[i][j]); } } return 0; }
相关文章推荐
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- NYOJ 92 图像有用区域 【bfs】
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- NYOJ 92 图像有用区域 (经典的 bfs)
- NYOJ 92 图像有用区域(BFS)
- nyoj ACM:图像有用区域 (bfs)
- NYOJ92 图像有用区域 【BFS】
- nyoj--92 图像有用区域(bfs)
- NYOJ-92 图像有用区域(bfs)
- nyoj 92 图像有用区域 【bfs】
- nyoj 图像有用区域(BFS)
- nyoj 92 图像有用区域 【BFS】 【好题 】
- NYOJ 92 图像有用区域 (BFS)
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- NYOJ 92--图像有用区域【BFS && 水题】
- NYOJ 92 图像有用区域 bfs