HDU1241 Oil Deposits (L)

来源:互联网 发布:交朋友软件 编辑:程序博客网 时间:2024/06/10 21:27

题意:给以个n*m的矩阵  ‘@’代表有矿 ‘*’代表没矿   @之间彼此连接在一起的算作是一处矿(包括水平 竖直 斜对角接触)  输出共有多少出矿藏

思路: 从第一个位置开始枚举  如果遇到@ 个数就加一  并且将它周围的@设置为已经访问过  同时对周围的@的周围进行探索  直到没有为止   重复上述操作 直到所有格子都已经被枚举完为止

其中要加k用于区分  是不是这堆矿中第一个矿点  防止重复计算

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<queue>#include<vector>using namespace std;#define maxn 150int n,m;char maps[maxn][maxn];bool vis[maxn][maxn];int ans;int go[8][2]={{1,0},{-1,0},{0,-1},{0,1},{1,1},{1,-1},{-1,1},{-1,-1}};//总共8个方向void bfs(int x,int y,int k)//k用于区分  是不是这堆矿中第一个矿点  防止重复计算{if(k==0)//除了第一次  其他都不用计算  算同一处矿ans++;vis[x][y]=true;for(int s=0;s<8;s++){int fx=x+go[s][0];int fy=y+go[s][1];if(fx>=0&&fx<n&&fy>=0&&fy<m&&!vis[fx][fy]&&maps[fx][fy]=='@'){bfs(fx,fy,1);}}}int main(){while(~scanf("%d%d",&n,&m)){if(m==0&&n==0)break;for(int i=0;i<n;i++)scanf("%s",maps[i]);memset(vis,0,sizeof vis);ans=0;for(int i=0;i<n;i++)//枚举矿点{for(int j=0;j<m;j++){if(maps[i][j]=='@'&&!vis[i][j]){bfs(i,j,0);}}}printf("%d\n",ans);}    return 0;}