抠图 java版(会超时,求更简便方法)
作者:互联网
蒜头君在做图像处理的项目时,遇到了一个问题。他需要摘取出图片中,某个黑色线框内的图片,现在请你来帮助他完成这一步,把黑色线框外的区域全部变为黑色,即只保留黑色线框内的颜色。
蒜头君可能同时摘取多个线框,这些线框不会出现相邻,相交,包含关系,因为选择线框太多,所以蒜头君可能把其中一部分的线框少画一条边,所以这种线框是无效的。
已知图中除了黑线上的点外,图像中没有纯黑色(即像素为 00 的点)。
矩形关系说明:
其中下面的数据也属于相邻。
1
0 0 0 1 1 1
2
0 1 0 1 1 1
3
0 0 0 1 1 1
4
1 1 1 0 0 0
5
1 1 1 0 1 0
6
1 1 1 0 0 0
也就是说 00 的周围(八个方向),不会有另外一个矩形的 00。
输入格式
第一行输入测试数据的组数 N(0 < N \le 10)N(0<N≤10)。
每组测试数据的第一行是两个整数 H,WH,W 分别表示图片的高度和宽度 (3 \le H,W \le 500)(3≤H,W≤500)。
随后的 HH 行,每行有 WW 个正整数,表示该点的像素值。(像素值都在 00 到 255255 之间,00 表示黑色,255255 表示白色),每行整数之间使用’\t’隔开。
输出格式
以矩阵形式输出,先把黑色框之外的区域变黑,然后输出图像中各点的像素值。
数据约定
对于 30%30% 的数据,线框是宽度为 11 的矩形,并且线框都是完整的。
对于 60%60% 的数据,线框是宽度不固定的的矩形,并且线框都是完整的。
对于 100%100% 的数据,线框可能有多个(题目保证线框不会出现相邻,相交,包含关系),线框是宽度不固定,有部分线框可能缺失其中的一条边(可以认为这种线框为无效线框)。
样例解释
对于第一组数据:
这是一个完整的矩形,所以会保留线框内的颜色,保留下 (3,2),(3,3)(3,2),(3,3) 的像素值。
对于第二组数据:
只有一个矩形,这个矩形不是完成整的矩形,所有是无效线框,所以没有像素值被保留。
对于第三组数据:
有多个矩形,且矩形都满足不相邻,相交,包含的关系。
样例输入复制
3
4 5
1 0 0 0 1
1 0 1 0 1
1 0 1 0 1
1 0 0 0 1
5 6
1 1 1 1 1 1
1 0 1 0 1 1
1 0 1 0 1 1
1 0 0 0 1 1
1 1 1 1 1 1
10 10
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 1 0 1 0
1 0 0 0 0 0 1 0 1 0
1 0 0 1 0 0 1 0 0 0
1 0 0 0 0 0 1 1 1 1
1 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 1 0 0 0
1 1 1 0 1 0 1 0 1 0
1 1 1 0 0 0 1 0 0 0
样例输出复制
0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0
import java.util.*;
public class Main {
static int w;
static int h;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int num=0;
int n=cin.nextInt();
for(int i=0;i<n;i++) {
h = cin.nextInt();
w = cin.nextInt();
int [][]shu = new int[h][w];
for(int j=0;j<h;j++) {
for(int k=0;k<w;k++) {
shu[j][k] = cin.nextInt();
}
}
for(int j=0;j<h;j++) {
for(int k=0;k<w;k++) {
if(shu[j][k]>0&&(j==0||k==0||j==h-1||k==w-1))
bfs(shu,j,k);
}
}
for(int j=0;j<h;j++) {
for(int k=0;k<w;k++) {
System.out.print(shu[j][k]);
}
System.out.println();
}
}
}
public static void bfs(int [][]shu,int x,int y) {
int dx,dy;
int []xx = new int[]{1,-1,0,0,1,1,-1,-1};
int []yy = new int[]{0,0,1,-1,1,-1,1,-1};
shu[x][y]=0;
for(int i=0;i<8;i++) {
dx=x+xx[i];
dy=y+yy[i];
if(dx<0||dx>=h||dy<0||dy>=w)
continue;
if(shu[dx][dy]>0)
bfs(shu,dx,dy);
}
return ;
}
}
秦楼月影
发布了4 篇原创文章 · 获赞 1 · 访问量 54
私信
关注
标签:00,超时,java,int,像素,黑色,线框,矩形,简便 来源: https://blog.csdn.net/weixin_45795519/article/details/104101532