鱼C论坛

 找回密码
 立即注册
查看: 2959|回复: 1

[技术交流] 034:oil deposits石油勘探

[复制链接]
发表于 2018-2-17 15:53:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Problem Description
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.



Input
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.



Output
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.



Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0



Sample Output
0 1 2 2

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-17 15:55:14 | 显示全部楼层
千万不要随意复制粘贴自己写过的类似的代码行,一旦没有及时改正不同的地方,就容易出现难找的错误。

#include<cstdio>
#define N 101

char maze[N][N];
bool mark[N][N];
int n,m;
int go[][2]={1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,-1,-1,1};
void DFS(int x,int y)
{
        for(int i=0;i<8;i++)
        {
                int nx=x+go[i][0];
                int ny=y+go[i][1];
                if(nx<1 || nx>n || ny<1 || ny>m)
                        continue;
                if(maze[nx][ny]=='*')
                        continue;
                if(mark[nx][ny]==true)        
                        continue;
                mark[nx][ny]=true;
                DFS(nx,ny);
        }
        return ;
}
int main()
{
        while(scanf("%d%d",&n,&m)!=EOF)
        {
                if(n==0&&m==0)
                        break;
                for(int i=1;i<=n;i++)
                        scanf("%s",maze[i]+1);   //maze[i]+1本身就是地址,无须&来取地址。maze[i]的地址为maze[i][0],maze[i]+1为maze[i][1] 
                for(int i=1;i<=n;i++)
                        for(int j=1;j<=m;j++)
                                mark[i][j]=false;
                int ans=0;
                for(int i=1;i<=n;i++)
                        for(int j=1;j<=m;j++)
                        {
                                if(mark[i][j]==true)
                                        continue;
                                if(maze[i][j]=='*')
                                        continue;
                                DFS(i,j);
                                ans++;
                        }
                printf("%d\n",ans);
        }
        return 0;        
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-6 07:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表