您的位置:首页 > 其它

SSL-ZYC 1454 找石油

2017-12-30 14:41 162 查看
题目大意:

有一块地有一些石油。“@”代表着这是石油,“#”代表着这不是石油。若两块石油相邻,则认为他们是一块石油。请问这块地里一共有多少块石油?

比如:



一共有三块石油。

思路:

这道题要用BFS。这道题从a[i][j]找到a
[m],每找到一块石油就把他和与它相邻的石油清零,并计数。

代码:

#include <iostream>
#include <cstdio>
using namespace std;
bool a[10001][10001];
int n,m,father[100001],state[3][100001],sum;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,-1,1,0,0};

void bfs(int x,int y)
{
int head,tail,i,j,qx,qy;
head=0;
tail=1;
father[1]=0;
a[x][y]=0;
state[1][1]=x;
state[2][1]=y;  //初始化
do
{
head++;
for (i=1;i<=4;i++)
{
qx=state[1][head]+dx[i];  //qx表示行
qy=state[2][head]+dy[i];  //qy表示列
if (qx>0&&qx<=n&&qy>0&&qy<=m&&a[qx][qy])  //如果这是石油而且没有超界
{
tail++;
father[tail]=head;  //入队
state[1][tail]=qx;
state[2][tail]=qy;
a[qx][qy]=0;
}
}
}
while(head<tail);
}
int main()
{
int i,j;
char read;
scanf("%d%d\n",&n,&m);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
read=getchar();
if (read=='@') a[i][j]=1;
}
read=getchar();
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
if (a[i][j]==1)
{
bfs(i,j);  //进行BFS
sum++;
}
}
printf("%d",sum);
return 0;
}


(这道题与细胞问题相似,方法基本一样)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: