• 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 }
  • 相关阅读:
    冲刺阶段 day1
    目标系统流程图 数据流图
    团队作业二
    校外实习报告(十二)
    校外实习报告(十一)
    第二周实习总结
    校外实习报告(十)
    校外实习报告(九)
    校外实习报告(八)
    校外实习报告(七)
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9403752.html
Copyright © 2020-2023  润新知