HDOJ-1241 Oil Deposits
2016-07-28 21:12
375 查看
Oil Deposits
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24541 Accepted Submission(s): 14094
[align=left]Problem Description[/align]
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots.
It then analyzes each plot separately, using sensing equipment to determine whether or not the plot contains oil. A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large
and may contain numerous pockets. Your job is to determine how many different oil deposits are contained in a grid.
[align=left]Input[/align]
The input file contains one or more grids. Each grid begins with a line containing m and n, the number of rows and columns in the grid, separated by a single space. If m = 0 it signals the end of the input; otherwise 1 <= m <= 100
and 1 <= n <= 100. Following this are m lines of n characters each (not counting the end-of-line characters). Each character corresponds to one plot, and is either `*', representing the absence of oil, or `@', representing an oil pocket.
[align=left]Output[/align]
For each grid, output the number of distinct oil deposits. Two different pockets are part of the same oil deposit if they are adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100 pockets.
[align=left]Sample Input[/align]
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
[align=left]Sample Output[/align]
0
1
2
2
介个题好难,a了半天还不对,测试样例以及自己写的都对,就是不AC,好像是网页出BUG了(简直日了dog)。用DFS/BFS都可以。
DFS代码:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> using namespace std; char map[110][110]; int vis[110][110]; int m,n,ans; int fx[8]={1,1, 1,0, 0,-1,-1,-1}; int fy[8]={1,0,-1,1,-1, 1, 0,-1}; void f(int x,int y) { for(int i=0;i<8;i++) { int dx=x+fx[i],dy=y+fy[i]; if(vis[dx][dy]==1&&dx>=0&&dx<n&&dy>=0&&dy<m) { vis[dx][dy]=0; f(dx,dy); } } } int main() { while(~scanf("%d%d",&n,&m)&&n||m) { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { getchar(); for(int j=0;j<m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='@') vis[i][j]=1; } } ans=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(vis[i][j]==1) { ans++; f(i,j); } } } printf("%d\n",ans); } return 0; }
BFS代码:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <queue> using namespace std; struct node{ int x,y; }; char map[110][110]; int vis[110][110]; int m,n,ans; int fx[8]={1,1, 1,0, 0,-1,-1,-1}; int fy[8]={1,0,-1,1,-1, 1, 0,-1}; void BFS(node s) { vis[s.x][s.y]=0; queue<node > q; q.push(s); while(!q.empty()) { node now=q.front(); q.pop(); for(int i=0;i<8;i++) { node next; next.x=now.x+fx[i]; next.y=now.y+fy[i]; if(vis[next.x][next.y]==1&&next.x>=0&&next.x<n&&next.y>=0&&next.y<m) { vis[next.x][next.y]=0; q.push(next); } } } } int main() { while(~scanf("%d%d",&n,&m)&&n||m) { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { getchar(); for(int j=0;j<m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='@') vis[i][j]=1; } } ans=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(vis[i][j]==1){ node s; s.x=i;s.y=j; ans++; BFS(s); } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 关于火狐和IE下select控制div
- bat面试内容
- mysql命令2
- jQuery 绑定 select 联动 手动触发
- Android 耳机按键与拔插监听
- iOS开发网络篇—监测网络状态
- 数据库数据拷贝
- ViewPager、ViewPager和Fragment组合使用的基本用法
- Codeforces 103A Testing Pants for Sadness
- kubernetes 1.3 的安装和集群环境部署
- MySQL之逻辑查询处理流程
- 简单的自我介绍
- not,and,or
- pip卡住不动的解决方案
- java 内存模型(JMM)简介
- 主从复制读写分离多种方案
- mysql语法速查
- 一个VR游戏DEMO的开发历程是怎样的?
- HDU Problem 2553 N皇后问题 【DFS】
- 使用高德地图api常见方法心得(1)