1. 程式人生 > >HDU 1562 Oil Deposits

HDU 1562 Oil Deposits

遍歷 separate osi rep round either and hdu square

題目:

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 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 [email protected]
/* */, representing an oil pocket.

Output

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

題意描述:
輸入n和m為矩陣的大小(1 <= m <= 100 and 1 <= n <= 100),以及n*m的矩陣
[email protected]
/* */(上下左右斜對角都能相連)
解題思路:
遍歷字符數組,[email protected],搜索過程中標記已經走過的地方,直到遍歷完所有元素。
代碼實現:
 1 #include<stdio.h>
 2 #include<string.h>
 3 char map[110][110];
 4 int m,n,book[110][110];
 5 void dfs(int x,int y,int c);
 6 int main() 
 7 {
 8     int i,j,num;
 9     while(scanf("%d%d",&m,&n),m||n)
10     {
11         memset(map,0,sizeof(map));//初始化的位置 
12         for(i=1;i<=m;i++)
13         {
14             for(j=1;j<=n;j++) 
15                 scanf(" %c",&map[i][j]);//處理行列數後多余的空格 
16             getchar();
17         }
18         memset(book,0,sizeof(book));
19         num=0;
20         for(i=1;i<=m;i++)
21         {
22             for(j=1;j<=n;j++)
23             {
24                 if(map[i][j]==@&&book[i][j]==0)
25                 {
26                     num--;
27                     book[i][j]=num;
28                     dfs(i,j,num);
29                 }
30             }
31         }
32         printf("%d\n",-num);
33     }
34     return 0;
35 }
36 void dfs(int x,int y,int c)
37 {
38     int next[8][2]={0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0,-1,1};//註意搜索的方向個數 
39     int k,tx,ty;
40     book[x][y]=c;
41     for(k=0;k<=7;k++)
42     {
43         tx=x + next[k][0];//位置在原來的基礎上變化 
44         ty=y + next[k][1];
45         if(tx<1||tx>m||ty>n||ty<1)
46             continue;
47         if(map[tx][ty]==@ && book[tx][ty]==0)
48         {
49             book[tx][ty]=c;
50             
51             dfs(tx,ty,c);
52         }
53     }
54     return ;
55 }

易錯分析:

1、處理地圖的時候註意吃掉空格

2、註意搜索方向的個數

3、tx要在原來的基礎上進行變化

HDU 1562 Oil Deposits