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 }