• NYOJ92图像有用区域


    图像有用区域

    时间限制: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
    View Code
     1  
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<queue>
     6 #include<algorithm>
     7 using namespace std;
     8 int map[1000][1500];
     9 int row,col;
    10 int dir[4][2]={0,1,-1,0,1,0,0,-1};
    11 queue<int>q;
    12 int overmap(int i,int j)
    13 {
    14     if(i<0||j<0||i>row+1||j>col+1)return 1;
    15     return 0;
    16 }
    17 void waikuang()
    18 {
    19      for(int i=0;i<col+2;++i)
    20      {
    21              map[0][i]=1;
    22              map[row+1][i]=1;
    23      }
    24      for(int i=0;i<row+2;++i)
    25      {
    26              map[i][0]=1;
    27              map[i][col+1]=1;
    28      }
    29 }
    30 void readmap()
    31 {
    32      for(int i=1;i<=row;++i)
    33         for(int j=1;j<=col;++j)
    34           scanf("%d",&map[i][j]);
    35 }
    36 void bfs(int i,int j)
    37 {
    38         int x,y;
    39         int a,b;
    40         q.push(i);q.push(j);
    41         while(!q.empty())
    42         {
    43           x=q.front();q.pop();
    44           y=q.front();q.pop();
    45           for(i=0;i<4;++i)
    46            {
    47               a=x+dir[i][0];
    48               b=y+dir[i][1];
    49               if(overmap(a,b))continue;
    50               if(map[a][b]==0)continue;
    51               map[a][b]=0;
    52               q.push(a);q.push(b);
    53            }
    54           }
    55 }
    56 void print()
    57 {
    58      for(int i=1;i<=row;++i)
    59         for(int j=1;j<=col;++j)
    60         {
    61             if(j!=col) printf("%d ",map[i][j]);
    62             else printf("%d\n",map[i][j]);
    63         }
    64 }     
    65 int main()
    66 {
    67     int ncase;
    68     scanf("%d",&ncase);
    69     while(ncase--)
    70     {
    71       while(!q.empty()) q.pop();
    72       scanf("%d%d",&col,&row);
    73       waikuang();
    74       readmap();
    75       bfs(0,0);
    76       print();
    77     }
    78     return 0;
    79 }
    80  
    81         
  • 相关阅读:
    Web Components 是什么
    HAL_RTC_MspInit Msp指代什么?
    C 枚举 相同的值
    EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗?
    ASP.NET Core MVC之ViewComponents(视图组件)知多少?
    .NET Core 1.1日期解析无APi、SQL Server数据转换JSON
    SQL Server-字字珠玑,一纸详文,完全理解SERIALIZABLE最高隔离级别(基础系列收尾篇)
    SQL Server-聚焦NOLOCK、UPDLOCK、HOLDLOCK、READPAST你弄懂多少?(三十四)
    SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)
    ASP.NET Core MVC上传、导入、导出知多少
  • 原文地址:https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi1992_2012_11_12.html
Copyright © 2020-2023  润新知