您的位置:首页 > 其它

hdu 1241 Oil Deposits - bfs

2013-11-15 10:18 465 查看
先把所有点标记为0,所有的'.'标记为1。然后从(0,0)开始搜索,如果遇到标记为0的就把他加入队列,并把他标记为1,再看他周围8个点,如果有遇到标记为0的就把他加入队列并标记为1,重复此步骤,直到队列为空。

当一个队列处理完后再从(0,0)开始搜索,重复以上步骤,直到搜索到右下角最后一个点。

#include <iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
char s[110][110];
int visit[110][110];
int main()
{
int l,c,i,j,a,b;
queue<int>q;
while(scanf("%d %d",&l,&c)) //l行,c列
{
if(l==0)break;
int sum=0;
memset(visit,0,sizeof(visit));
for(i=0;i<l;i++)
{
scanf("%s",s[i]);
for(j=0;j<c;j++) //'.'标记为1
{
if(s[i][j]=='.')
visit[i][j]=1;
}
}

for(a=0;a<l;a++)
{
for(b=0;b<c;b++)
{
if(s[a][b]=='@'&&visit[a][b]==0) //从(0,0)开始找到第一个标记为0的
{
q.push(a);
q.push(b);
sum++;
while(!q.empty())
{
i=q.front();
q.pop();
j=q.front();
q.pop();
if(j-1>=0&&i-1>=0&&s[i-1][j-1]=='@'&&visit[i-1][j-1]==0)
{visit[i-1][j-1]=1;
q.push(i-1);
q.push(j-1);
}
if(i-1>=0&&s[i-1][j]=='@'&&visit[i-1][j]==0)
{visit[i-1][j]=1;
q.push(i-1);
q.push(j);
}
if(i-1>=0&&j+1<c&&s[i-1][j+1]=='@'&&visit[i-1][j+1]==0)
{visit[i-1][j+1]=1;
q.push(i-1);
q.push(j+1);
}
if(j-1>=0&&s[i][j-1]=='@'&&visit[i][j-1]==0)
{visit[i][j-1]=1;
q.push(i);
q.push(j-1);
}
if(j+1<c&&s[i][j+1]=='@'&&visit[i][j+1]==0)
{
visit[i][j+1]=1;
q.push(i);
q.push(j+1);
}
if(i+1<l&&j-1>=0&&s[i+1][j-1]=='@'&&visit[i+1][j-1]==0)
{
visit[i+1][j-1]=1;
q.push(i+1);
q.push(j-1);
}
if(i+1<l&&s[i+1][j]=='@'&&visit[i+1][j]==0)
{
visit[i+1][j]=1;
q.push(i+1);
q.push(j);
}
if(i+1<l&&j+1<c&&s[i+1][j+1]=='@'&&visit[i+1][j+1]==0)
{
visit[i+1][j+1]=1;
q.push(i+1);
q.push(j+1);
}
}//while
}//if
}//for
}//for

printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: