• ACM 图像有用区域


    图像有用区域

    时间限制:3000 ms  |  内存限制:65535 KB
    难度: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

     认真读题目不要把宽和高弄反了,在原有的图像外围添加了两圈,最外圈值为-1,第二圈值为1

    值为-1的圈限制界限避免超界,值为1的圈可以免去第一个点的确定

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    #include <cstring>
    using namespace std;
    typedef pair<int,int> Point;
    int pixel[965][1445];
    const int dx[] = {-1,0,1,0};
    const int dy[] = {0,1,0,-1};
    
    void bfs(int x, int y){
        queue<Point> q;
        q.push(Point(x,y));
        while(!q.empty()){
            Point tmp = q.front();q.pop();
            for(int i = 0 ; i <4; ++ i){
                int xx =tmp.first+dx[i] ,yy = tmp.second+dy[i];
                if(pixel[xx][yy]>0){
                    q.push(Point(xx,yy));
                    pixel[xx][yy] = 0;
                }
            }
        }
    }
    
    int main(){
        int n;
        cin >> n;
        while(n--){
            int w,h;
            cin >> h >> w;
            memset(pixel,-1,sizeof(pixel));
            for(int i = 1; i <= h+2; ++ i) pixel[1][i] = pixel[w+2][i]=1;
            for(int i = 1; i <= w+2; ++ i) pixel[i][1] = pixel[i][h+2]=1;
            for(int i = 2; i <= w+1; ++ i){
                for(int j = 2; j <= h+1; ++ j){
                    cin >> pixel[i][j];
                }
            }
            bfs(1,1);
            for(int i = 2; i <= w+1; ++ i){
                for(int j = 2; j <= h+1; ++ j){
                    if(j != 2) cout<<" ";
                    cout<<pixel[i][j];
                }
                cout<<endl;
            }
        }
    }
  • 相关阅读:
    卡拉OK歌词原理和实现高仿Android网易云音乐
    LRC歌词原理和实现高仿Android网易云音乐
    Android项目实战之高仿网易云音乐创建项目和配置
    Android项目实战之高仿网易云音乐项目介绍
    WPS for Linux 与统一操作系统 UOS 完成适配,WP越来越强大
    2020 年,Linux 设备或将爆炸式增长
    随机电话号码生成器怎么在线使用?
    Chrome是老大,Firefox 是老二,Edge 不是老三
    2020 年的云世界三个方面:新联盟、无服务器和安全挑战
    电话号码生成器手机版,苹果和安卓手机均可用
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3709865.html
Copyright © 2020-2023  润新知