acm_92图像有用区域

来源:互联网 发布:星星知多少 编辑:程序博客网 时间:2024/05/16 07:03

图像有用区域

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

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

    

               图1                                                       图2 

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

输入
第一行输入测试数据的组数N(0
每组测试数据的第一行是两个个整数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
来源
[张云聪]原创
上传者
张云

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


package UnRelatedDiagram;

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

public class Main {

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

    public voidsolution() {
       in = newScanner(System.in);
       data =newint [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]);
          }
       }
    }
    Scannerin;
    int[][]data;
    intwidth;
    intheight;
   
    private voidgetDate(){
      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 voidinit(){
       for(int i =1; i<= height ; i++){
          for(int j =1 ; j <= width;j++){
             data[i][j] =0;
          }
       }
       height =0;
       width =0;
    }
    privateboolean isOufof0Exits(){
       for(int i = 1 ; i <=height ;i++ ){
           if(data[i][1] != 0){
               bfs(newPoint(i, 1));
           }
           if(data[i][width] != 0){
               bfs(newPoint(i, width));
           }
       }
       for(int i = 1 ; i <= width;i++){
          if(data[1][i] != 0){
              bfs(newPoint(1, i));
           }
          
          if(data[height][i] != 0){
              bfs(newPoint(height, i));
           }
       }
       returntrue;
    }
   
   //使用bfs去搜索路径
    private voidbfs(Point start){
      Queue waitList= new LinkedList();
      waitList.add(start);
      int[][] shift = {{1,0},{-1,0},{0,1},{0,-1}};
      while(!waitList.isEmpty()){
         Point pointer =waitList.poll();
         if(data[pointer.x][pointer.y]!= 0){
            data[pointer.x][pointer.y] =0;
            for(int i = 0 ; i<shift.length;i++){
              if(data[pointer.x+shift[i][0]][pointer.y+shift[i][1]]!=0){
                  waitList.add(newPoint(pointer.x+shift[i][0],pointer.y+shift[i][1]));
               }
            }
         }
      }
    }
}

0 0