算法:搜索
难度: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
代码:
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <stdio.h>
using namespace std;
int a[1000][1500],n,m;
int b[4][2]={0,1,0,-1,1,0,-1,0};
void dfs(int x,int y)
{
queue<int>que;
int dx,dy,i,j,k;
que.push(x);
que.push(y);
a[x][y]=0;
while(que.size())
{
i=que.front();
que.pop();
j=que.front();
que.pop();
for(k=0;k<4;k++)
{
dx=i+b[k][0];
dy=j+b[k][1];
if(dx>=0&&dx<=n+1&&dy>=0&&dy<=m+1&&a[dx][dy]!=0)
{
que.push(dx);
que.push(dy);
a[dx][dy]=0;
}
}
}
}
int main()
{
int i,j,t;
cin>>t;
while(t--)
{
cin>>m>>n;
for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
a[i][j]=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cin>>a[i][j];
}
dfs(0,0);
for(i=1;i<=n;i++)
{
for(j=1;j<=m-1;j++)
cout<<a[i][j]<<" ";
cout<<a[i][m]<<endl;
}
}
return 0;
}