图像有用区域(广搜)

来源:互联网 发布:nob2b 邮件群发软件 编辑:程序博客网 时间:2024/06/06 21:43

图像有用区域

时间限制: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表示白色)
输出
以矩阵形式输出把黑色框之外的区域变黑之后的图像中各点的像素值。
样例输入
15 5100 253 214 146 120123 0 0 0 054 0 33 47 0255 0 0 78 014 11 0 0 0
样例输出
0 0 0 0 00 0 0 0 00 0 33 47 00 0 0 78 00 0 0 0 0


代码

#include<stdio.h>#include<queue>// 广搜用stl队列using namespace std;struct node{int x;int y;};queue<node>q;//结构体队列int p[1000][1500];int w, h;int dir[4][2] = {0, 1, 0, -1, 1, 0, -1,0};//表示上下左右四个方向的数组void bfs(int x, int y){node start, next;int i;start.x = x;start.y = y;q.push(start);p[x][y] = 0;while(!q.empty()){start = q.front();for(i = 0; i < 4; i++){next.x = start.x + dir[i][0];next.y = start.y + dir[i][1];if(next.x < 0 || next.y < 0 ||next.x >= h  || next.y >= w || !p[next.x][next.y])// 判断是否出界以及是否被标记continue;q.push(next);p[next.x][next.y] = 0;}q.pop();}}int main(){int t;int i,j;scanf("%d",&t);while(t--){scanf("%d%d",&w,&h);for (i = 0;i<h;i++)for (j = 0;j<w;j++)scanf("%d",&p[i][j]);for (i = 0;i<h;i++)//四条边分别进行搜索if (p[i][0])bfs(i,0);for (j = 0;j<w;j++)if (p[0][j])bfs(0,j);for (i = 0;i<h;i++)if (p[i][w-1])bfs(i,w-1);for (j = 0;j<w;j++)if (p[h-1][j])bfs(h-1,j);for (i = 0;i<h;i++)for (j = 0;j<w;j++)printf("%d%c",p[i][j],j!=w-1?' ':'\n');               //换行}}       




原创粉丝点击