SSL-ZYC 1454 找石油
2017-12-30 14:41
162 查看
题目大意:
有一块地有一些石油。“@”代表着这是石油,“#”代表着这不是石油。若两块石油相邻,则认为他们是一块石油。请问这块地里一共有多少块石油?
比如:
一共有三块石油。
思路:
这道题要用BFS。这道题从a[i][j]找到a
[m],每找到一块石油就把他和与它相邻的石油清零,并计数。
代码:
(这道题与细胞问题相似,方法基本一样)
有一块地有一些石油。“@”代表着这是石油,“#”代表着这不是石油。若两块石油相邻,则认为他们是一块石油。请问这块地里一共有多少块石油?
比如:
一共有三块石油。
思路:
这道题要用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; }
(这道题与细胞问题相似,方法基本一样)
相关文章推荐
- SSL-ZYC 反射
- SSL-ZYC NOIP
- SSL-ZYC 有理逼近
- SSL-ZYC 2576 平台
- SSL-ZYC 道路阻塞
- SSL-ZYC 懒惰的奶牛②
- SSL-ZYC 活动安排
- SSL-ZYC 1500 最短路上的统计
- SSL-ZYC 2547 圆环
- SSL-ZYC 2347 搭配购买
- SSL-ZYC 二项式展开式
- SSL-ZYC 最小步数
- SSL-ZYC 1618 剑鱼行动
- SSL-ZYC 1760 商店选址问题
- SSL-ZYC 1615 Frogger
- SSL-ZYC 公牛数学
- SSL-ZYC 1682 1764 最短网络
- SSL-ZYC 2344 刻录光盘
- SSL-ZYC 1612 最优布线问题
- SSL-ZYC 2574 Closest