抠图 java版(会超时,求更简便方法)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了抠图 java版(会超时,求更简便方法),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3065字,纯文字阅读大概需要5分钟。
内容图文
![抠图 java版(会超时,求更简便方法)](/upload/InfoBanner/zyjiaocheng/645/0d37003a6fd64efab2308ed2ea36e3c8.jpg)
蒜头君在做图像处理的项目时,遇到了一个问题。他需要摘取出图片中,某个黑色线框内的图片,现在请你来帮助他完成这一步,把黑色线框外的区域全部变为黑色,即只保留黑色线框内的颜色。
蒜头君可能同时摘取多个线框,这些线框不会出现相邻,相交,包含关系,因为选择线框太多,所以蒜头君可能把其中一部分的线框少画一条边,所以这种线框是无效的。
已知图中除了黑线上的点外,图像中没有纯黑色(即像素为 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
私信
关注
内容总结
以上是互联网集市为您收集整理的抠图 java版(会超时,求更简便方法)全部内容,希望文章能够帮你解决抠图 java版(会超时,求更简便方法)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。