描述
“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
- 解题思路:
- 这道题是一道广搜的题目,需要注意的一点是,输入的W,H分别表示图片的宽度和高度,其他就可以按广搜来处理。
- 要在输入的矩阵外层再加一圈,全部赋值为1,再进行广搜就可以。
具体代码:
1 2 #include<iostream> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 int map[965][1445],w,h; 7 int fangxiang[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 8 struct Node 9 { 10 int x; 11 int y; 12 Node (int x1,int y1):x(x1),y(y1){} 13 }; 14 void bfs(int x,int y) 15 { 16 Node node(x,y); 17 queue<Node> q; 18 while(!q.empty())q.pop(); 19 q.push(node); 20 while(!q.empty()) 21 { 22 node=q.front(); 23 q.pop(); 24 for(int i=0;i<4;i++) 25 { 26 int xx=node.x+fangxiang[i][0]; 27 int yy=node.y+fangxiang[i][1]; 28 if(xx>=0&&xx<=h+1&&yy>=0&&yy<=w+1&&map[xx][yy]) 29 { 30 map[xx][yy]=0; 31 Node next(xx,yy); 32 q.push(next); 33 } 34 } 35 } 36 } 37 int main() 38 { 39 int t; 40 cin>>t; 41 while(t--) 42 { 43 cin>>w>>h; 44 memset(map,1,sizeof(map)); 45 for(int i=1;i<=h;i++) 46 for(int j=1;j<=w;j++) 47 cin>>map[i][j]; 48 bfs(0,0); 49 for(int i=1;i<=h;i++) 50 { 51 for(int j=1;j<=w;j++) 52 { 53 cout<<map[i][j]<<" "; 54 } 55 cout<<endl; 56 } 57 cout<<endl; 58 } 59 //system("pause"); 60 return 0; 61 } 62