NYOJ92图像有用区域

来源:互联网 发布:淘宝退款原因有哪些 编辑:程序博客网 时间:2024/09/21 06:34


图像有用区域

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述

“ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色。

     

                图1                                                        图2 

已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点)。

输入
第一行输入测试数据的组数N(0<N<=6)
每组测试数据的第一行是两个个整数W,H分表表示图片的宽度和高度(3<=W<=1440,3<=H<=960)
随后的H行,每行有W个正整数,表示该点的像素值。(像素值都在0到255之间,0表示黑色,255表示白色)
输出
以矩阵形式输出把黑色框之外的区域变黑之后的图像中各点的像素值。
样例输入
15 5100 253 214 146 120123 0 0 0 054 0 33 47 0255 0 0 78 014 11 0 0 0
样例输出
0 0 0 0 00 0 0 0 00 0 33 47 00 0 0 78 00 0 0 0 0
#include<stdio.h>  #include<string.h>  #include<queue>  #include<algorithm>  using namespace std;  struct node  {      int x;      int y;  };  queue<node>Q;  int map[1445][1445];  int dx[4]={0,0,1,-1};  int dy[4]={1,-1,0,0};  int w,h,s,t,i,j;  void bfs(int i,int j)//**广搜**//  {      if(map[i][j]>0)      {          node e={i,j};          Q.push(e); //将结构体放入队列中         map[i][j]=0;          while(!Q.empty())          {              e=Q.front();//返回队首元素              Q.pop();//清除队首元素              for(int k=0;k<4;k++)              {  //对四个方向进行搜索                 s=e.x+dx[k];                  t=e.y+dy[k];                  if(map[s][t]>0)                  {                      node e1={s,t};                      Q.push(e1);                      map[s][t]=0;                  }  }          }        }  }  int main()  {      int ncases,i,j;      scanf("%d",&ncases);      while(ncases--)      {          memset(map,0,sizeof(map));//**全部清零,就不需要再添加一层0了**//          scanf("%d %d",&w,&h);          for(i=2;i<=h+1;i++)          {              for(j=2;j<=w+1;j++)              {                  scanf("%d",&map[i][j]);              }          }          for(i=1;i<=h+2;i++)//**处理边界,在外层加上一层1**//          {              map[i][1]=map[i][w+2]=1;          }          for(i=1;i<=w+2;i++)//**处理边界,在外层加上一层1**//          {              map[1][i]=map[h+2][i]=1;          }          bfs(1,1);//**从(1,1)作为起始点开始搜索**//          for(i=2;i<=h+1;i++)          {              for(j=2;j<=w+1;j++)              {                  if(j==2)//**格式**//                  {                      printf("%d",map[i][j]);                  }                  else                  {                      printf(" %d",map[i][j]);                  }              }              printf("\n");          }      }      return 0;  }  

在题目的输入上是先宽后高,跟一般的思维方式有点不一样。

关键思路:开始找出发地是个技巧,在地图的外围加上一层1,再在1外层加上一层0,然后就可以从(1,1)开始搜索。



原创粉丝点击