nyoj 92-图像有用区域 (BFS)

Posted getcharzp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 




以上是关于nyoj 92-图像有用区域 (BFS)的主要内容,如果未能解决你的问题,请参考以下文章

nyoj 92 图像有用区域

NYOJ 353 3D dungeon bfs

Nyoj 21 三个水杯(bfs)

nyoj 284 坦克大战bfs

HDU 1253 胜利大逃亡 NYOJ 523BFS

nyoj 21-三个水杯(BFS)