现在的位置: 首页 > 综合 > 正文

acm_92图像有用区域

2018年03月29日 ⁄ 综合 ⁄ 共 1540字 ⁄ 字号 评论关闭

图像有用区域

时间限制:3000 ms
  内存限制:65535
KB
难度:4
描述

“ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。

  
  

          
     图1                                                  
     图2 

已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点)。

输入
第一行输入测试数据的组数N(0
每组测试数据的第一行是两个个整数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
来源

[张云聪]原创
上传者

张云

     这道题目暴露的一个主要破绽是所有0外面的区域 都和外边界的某一点存在着路径,所以用广度优先搜索很容易弄出来,本体的数据量很大,所以存在冗余的方法容易栈溢出,导致rtr

package UnRelatedDiagram;

import java.awt.Point;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {

    public
static void main(String[] args) {
        
Main main = new Main();
        
main.solution();
    }

    public void
solution() {
   
    in = new
Scanner(System.in);
   
    data =new
int [961][1441];
   
    int groups =
in.nextInt();
   
    for (int i =
0; i < groups; i++) {
   
   
   
getDate();
   
   
   
isOufof0Exits();
   
   
    for(int k =
1; k<= height ; k++){
   
   
   
    for(int j =
1 ; j < width;j++){
                  
System.out.print(data[k][j]+" ");
   
   
   
    }
   
   
   
   
System.out.println(data[k][width]);
   
   
    }
   
    }
    }
    Scanner
in;
    int[][]
data;
    int
width;
    int
height;
   
    private void
getDate(){
   
   
init();
   
    width =
in.nextInt();
   
    height =
in.nextInt();
   
    for(int i =
1; i<= height ; i++){
   
   
    for(int j =
1 ; j <= width;j++){
   
   
   
    data[i][j] =
in.nextInt();
   
   
    }
   
   
  
    }
   
    private void
init(){
   
    for(int i =
1; i<= height ; i++){
   
 

【上篇】
【下篇】

抱歉!评论已关闭.