Hdu 1241

来源:互联网 发布:天猫是属于淘宝的吗 编辑:程序博客网 时间:2024/04/30 01:42

Oil Deposits

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17290    Accepted Submission(s): 9961


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
0122

这道题是典型的深度搜索题,可以根据状态的转换来判断是否可以继续搜索。在搜索的过程中把已经搜索过的位置变成不能被搜索的状态,在主函数中记录能进入搜索的次数及为目标块数。(可以全部进行搜索,也可以只对输入的“油田”位置进行搜索)

以下是我的代码:

#include<iostream>#include<cstdio>using namespace std;const int Max=10010;int dx[8]={-1,-1,-1,0,0,1,1,1};int dy[8]={-1,0,1,-1,1,-1,0,1};char d[Max][Max];int M[Max],N[Max];int num,num2,num1,Num;void dfs(int x,int y){    int xx,yy;    d[x][y]='*';    for(int i=0;i<8;i++){        xx=x+dx[i];        yy=y+dy[i];        //位置的转移        if(xx<0||yy<0||xx>=num||yy>=num2) continue;//判断越界        else if(d[xx][yy]=='@') dfs(xx,yy);    }}int main(){    while(scanf("%d%d",&num,&num2)!=EOF){            if(num==0) break;            Num=num1=0;            for(int i=0;i<num;i++){                    scanf("%s",d[i]);                    for(int j=0;j<num2;j++){                    if(d[i][j]=='@')                    {                        M[num1]=i;                        N[num1]=j;                        num1++;                    }//保存输入的“油田位置”                }            }            for(int i=0;i<num1;i++){                if(d[M[i]][N[i]]=='@'){                dfs(M[i],N[i]);//能进入搜索的必然是油田块                Num++;                }            }            printf("%d\n",Num);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 踢球膝关节伤筋怎么办 腿膝盖内侧扭伤怎么办 腱鞘炎做小针刀手指伸不直怎么办 胳膊无故筋疼怎么办 胳膊肘聚筋了怎么办 手臂筋扭伤肿痛怎么办 胳膊经常扭到怎么办 小孩胳膊扭到了怎么办 打篮球胳膊扭了怎么办 大腿根有淋巴结怎么办 脸上长了淋巴结怎么办 拔牙后淋巴肿痛怎么办 脖子上生淋巴结怎么办 脖子两侧淋巴结肿大怎么办 脖子左侧锁骨痛怎么办 整牙后中线歪了怎么办 右侧卵巢旁囊肿怎么办 颈下淋巴结肿大怎么办 耳朵后面淋巴结肿大怎么办 颈侧淋巴结肿大怎么办 锁骨窝淋巴肿大怎么办 晚上颈肌痉挛怎么办 劲部淋巴结肿大怎么办 胸锁乳头肌增厚怎么办 幼儿脖子两边歪怎么办 小孩脖子偏一边怎么办 小孩头有点歪怎么办 宝宝脖子有点歪怎么办 心情郁闷胸口疼怎么办 宝宝咳嗽胸口疼怎么办 小孩脖子歪了怎么办 脖子有点向右偏怎么办 感觉乳房有硬块怎么办 宝宝有点歪头怎么办 一岁半宝宝头歪怎么办 宝宝头偏向左边怎么办 长大了头睡偏了怎么办 一岁半宝宝头偏怎么办 小宝宝头有点歪怎么办 婴儿头向左歪怎么办 孩子突然脖子歪怎么办