您的位置:首页 > 其它

nyoj 92 图像有用区域 bfs

2017-05-09 12:12 351 查看
题目链接

思路:

bfs,遍历整个图遇到0就跳过,否则就将数归为0,这样就使得0包围的区域内还是不变的.但是这个题注意的是边界问题,可能0在最外围会影响遍历整个图,解决办法就是在最外围加一圈非0的,这样就可以保证遍历整个图了.

PS:

我一开始就是以为记录每一行是否有0,如果没有直接全为0,如果有我就直接从前一边遍历一边清0直到遇到第一个0停止,从后往前也是,这样我觉得也可以清除外围的0,结果一直wa,也没找到合适样例....

#include<bits/stdc++.h>
using namespace std;
int mp[2222][2222];
int book[2222][2222];
int w,h,t;
int go[4][2]={0,1,1,0,0,-1,-1,0};
struct node
{
int x,y;
};
bool check(int x,int y)
{
if(x<0||x>h+1||y<0||y>w+1||book[x][y]==1||mp[x][y]==0)
return false;
return true;
}
void bfs(int x,int y)
{
queue<node>Q;
node q,p;
book[x][y]=1;
q.x=x;
q.y=y;
Q.push(q);
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
int tx=p.x+go[i][0];
int ty=p.y+go[i][1];
if(check(tx,ty)==false)
continue;
mp[tx][ty]=0;
q.x=tx;
q.y=ty;
Q.push(q);
}
}
return ;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&w,&h);
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
scanf("%d",&mp[i][j]);
}
}
for(int i=0;i<=w+1;i++)
{
mp[0][i]=255;
mp[h+1][i]=255;
}
for(int i=0;i<=h+1;i++)
{
mp[i][0]=255;
mp[i][w+1]=255;
}
memset(book,0,sizeof(book));
bfs(0,0);
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
printf("%d",mp[i][j]);
if(j!=w)
printf(" ");
else
printf("\n");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: