题目大意:
有一块地有一些石油。“@”代表着这是石油,“#”代表着这不是石油。若两块石油相邻,则认为他们是一块石油。请问这块地里一共有多少块石油?
比如:
一共有三块石油。
思路:
这道题要用BFS。这道题从a[i][j]找到a[n][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;
}
(这道题与细胞问题相似,方法基本一样)