zoukankan      html  css  js  c++  java
  • nyoj 92-图像有用区域 (BFS)

    92-图像有用区域


    内存限制:64MB 时间限制:3000ms 特判: No
    通过数:4 提交数:12 难度: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

    C/C++:

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstring>
      4 #include <cstdio>
      5 #include <cmath>
      6 #include <stack>
      7 #include <set>
      8 #include <map>
      9 #include <queue>
     10 #include <climits>
     11 #include <bitset>
     12 #define eps 1e-6
     13 
     14 using namespace std;
     15 int n, m, my_map[965][1450], my_book[965][1450], my_mov[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
     16 
     17 struct node
     18 {
     19     int h, w;
     20 };
     21 
     22 bool my_judge(node q2)
     23 {
     24     if (q2.h < 0 || q2.w < 0 || q2.w > n + 1 || q2.h > m + 1) return false;
     25     if (!my_map[q2.h][q2.w]) return false;
     26     if (my_book[q2.h][q2.w]) return false;
     27     return true;
     28 }
     29 
     30 void bfs(int h, int w)
     31 {
     32     node q1, q2;
     33     q1.h = h, q1.w = w;
     34     queue <node> Q;
     35     Q.push(q1);
     36     my_book[h][w] = 1;
     37     while (!Q.empty())
     38     {
     39         q1 = Q.front();
     40         for (int i = 0; i < 4; ++ i)
     41         {
     42             q2 = q1;
     43             q2.h = q1.h + my_mov[i][0];
     44             q2.w = q1.w + my_mov[i][1];
     45             if (my_judge(q2))
     46             {
     47                 my_book[q2.h][q2.w] = 1;
     48                 Q.push(q2);
     49             }
     50         }
     51         Q.pop();
     52     }
     53 }
     54 
     55 int main()
     56 {
     57     ios::sync_with_stdio(false);
     58     int t;
     59     scanf("%d", &t);
     60     while (t --)
     61     {
     62         scanf("%d%d", &n, &m); // n 宽度
     63 
     64         /**
     65             初始化边界
     66         */
     67         for (int i = 0; i <= n; ++ i) {
     68             my_map[0][i] = my_map[m + 1][i] = 1;
     69         }
     70         for (int i = 0; i <= m; ++ i) {
     71             my_map[i][0] = my_map[i][n + 1] = 1;
     72         }
     73 
     74         /**
     75             输入数据
     76         */
     77         for (int i = 1; i <= m; ++ i)
     78         {
     79             for (int j = 1; j <= n; ++ j)
     80                 scanf("%d", &my_map[i][j]);
     81         }
     82 
     83         /**
     84             初始化判断条件
     85         */
     86         memset(my_book, 0, sizeof(my_book));
     87 
     88         bfs(0, 0);
     89 
     90         for (int i = 1; i <= m; ++ i)
     91         {
     92             for (int j = 1; j <= n; ++ j)
     93                 if (!my_book[i][j])
     94                     printf("%d ", my_map[i][j]);
     95                 else
     96                     printf("0 ");
     97             printf("
    ");
     98         }
     99     }
    100 
    101     return 0;
    102 }
  • 相关阅读:
    使用electron+vue开发一个跨平台todolist(便签)桌面应用
    初识ABP vNext(12):模块的独立运行与托管
    【老孟Flutter】41个酷炫的 Loading 组件库
    【Flutter 实战】酷炫的开关动画效果
    【老孟Flutter】自定义文本步进组件
    【老孟Flutter】6种极大提升Flutter开发效率的工具包
    【Flutter 实战】pubspec.yaml 配置文件详解
    Flutter 1.22版本新增的Button
    【Flutter 混合开发】添加 Flutter 到 iOS
    【Flutter 混合开发】添加 Flutter 到 Android Fragment
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9403752.html
Copyright © 2011-2022 走看看