<pre name="code" class="cpp">题目大意:输入一个二维网格。每一个网格单元中仅仅有两种字符'*'和'@','@'表示油田。'*'表示土地。求出网格中共同拥有多少块油田?
注意:全部横向。竖向。对角线方向连同的油田算一块油田。
算法思想:
广度优先搜索。扫描每个网格。推断该网格是否是油田且未被标记,若是则计数加1而且进行广搜标记全部与其相连通
的油田,若不是则仅仅标记。扫描全然部的网格后输出计数值就可以。
代码例如以下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int m,n;
const int M=105;
int color[M][M];
char grid[M][M];//注意为字符数组
void Bfs(int a,int b){
if(color[a][b]==0) return ;
else{
color[a][b]=0;
if(grid[a][b]=='*') return ;
else{
if(a-1>0) Bfs(a-1,b);//上
if(a+1<=m) Bfs(a+1,b);//下
if(b-1>0) Bfs(a,b-1);//左
if(b+1<=n) Bfs(a,b+1);//右
if(a-1>0&&b-1>0) Bfs(a-1,b-1);//左上
if(a-1>0&&b+1<=n) Bfs(a-1,b+1);//右上
if(a+1<=m&&b-1>0) Bfs(a+1,b-1);//左下
if(a+1<=m&&b+1<=n) Bfs(a+1,b+1);//右下
}
}
}
int main(){
while(cin>>m>>n){
if(m==0) break;
memset(color,-1,sizeof(color));
int count=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>grid[i][j];
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(color[i][j]==0) continue;
else{
if(grid[i][j]=='*'){
color[i][j]=0;
continue;
}
else{
count++;
Bfs(i,j);
}
}
}
}
cout<<count<<endl;
}
return 0;
}