您的位置:首页 > 其它

NYOJ 92 图像有用区域

2012-02-23 16:33 176 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=92

广搜问题。。。从上午一直弄到下午,最后发现自己画蛇添足,泪流满面。。。。。题目很简单,但深搜RumtimeError.跟迷宫那题差不多,只是不需要处理递归的边界(这就是悲剧所在,浪费了一个上午。。。。),还有个坑就在题目上面的输入,是先宽后高,跟一般的思维方式有点不一样。切到200道题了,虽然水题很多,纪念一下


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

代码:

#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;
}
}
}
while(!Q.empty())
{
Q.pop();
}
}
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: