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("\n");
 98         }
 99     }
100 
101     return 0;
102 }

 

posted @ 2018-08-01 20:25  GetcharZp  阅读(104)  评论(0编辑  收藏  举报