NYOJ 92 图像有用区域(BFS)
图像有用区域
- 描述
-
“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
第一次WA的时候注意到宽高了,然后在n次WA以后注意到数组宽高开反了。
还是被输入坑了。
加一条非0的框然后沿着框BFS就好了。
代码:1 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 7 int m,n; 8 int G[965][1455]; 9 int d[4][2]={1,0,0,1,-1,0,0,-1}; 10 11 struct point 12 { 13 int x; 14 int y; 15 }; 16 17 18 void BFS() 19 { 20 queue<point>p; 21 point initial,NewNode; 22 initial.x=initial.y=0; 23 p.push(initial); 24 while(!p.empty()) 25 { 26 point Node=p.front(); 27 p.pop(); 28 for(int i=0;i<4;i++) 29 { 30 int xx=Node.x+d[i][0]; 31 int yy=Node.y+d[i][1]; 32 if(xx<0||xx>n+1||yy<0||yy>m+1||!G[xx][yy]) 33 continue; 34 NewNode.x=xx; 35 NewNode.y=yy; 36 G[xx][yy]=0; 37 p.push(NewNode); 38 } 39 } 40 } 41 42 int main() 43 { 44 int t,i,j; 45 scanf("%d",&t); 46 while(t--) 47 { 48 scanf("%d%d",&m,&n); 49 for(i=0;i<=n+1;i++) 50 for(j=0;j<=m+1;j++) 51 if(i==0||j==0||i==n+1||j==m+1) 52 G[i][j]=1; 53 for(i=1;i<=n;i++) 54 for(j=1;j<=m;j++) 55 scanf("%d",&G[i][j]); 56 BFS(); 57 for(i=1;i<=n;i++) 58 for(j=1;j<=m;j++) 59 if(j==m) 60 printf("%d\n",G[i][j]); 61 else 62 printf("%d ",G[i][j]); 63 } 64 return 0; 65 } 66