【算法练习-穷竭搜索】Lake Counting(POJ No.2386)

Posted on 2019-07-23 17:07  常少卿  阅读(157)  评论(0)    收藏  举报

题目来自《挑战程序设计竞赛》ch2p32

  有一个大小为N*M的园子,雨后积起了水。八连通的积水被认为是连在一起的。请求出园子里共多少水洼?(八连通是指下图中相对w的*的部分)

  ***

  *w*

  ***

限制条件N,M<=100。

 

 1 #include <iostream>
 2 
 3 void dfs(int,int,int,int,char**);
 4 void solve(int,int,char**);
 5 void printAry(int,int,char**);
 6 
 7 int main() {
 8     using namespace std;
 9     int n,m;
10     cin>>n;
11     cin>>m;
12 
13     char field[n][m+1];//园子
14     char* p[m+1];//用指针的指针来代表二维数组
15 
16     //p[0] = &field[0][0];
17     for(int i = 0;i < n; i++){
18         for(int j = 0;j < m;j++){
19             cin>>field[i][j];
20         }
21         //if(i!=0)
22         p[i] = &field[i][0];
23     }
24 
25     //printAry(n,m,p);
26     solve(n,m,p);
27     return 0;
28 }
29 
30 //现在位置(x,y)
31 void dfs(int x, int y,int n,int m,char **field){
32     //将现在所有位置替换为
33 *(*field+x*(m+1)+y) = '.';
34 
35     //遍历循环移动8个方向
36     for(int dx = -1; dx <= 1; dx++){
37         for(int dy = -1;dy <=1; dy++){
38          //向x方向移动dx,向y方向移动dy,移动结果为(nx,ny)
39          int nx = x + dx;
40          int ny = y + dy;
41          //判断nx, ny是不是在园子里,以及是否有积水
42          if(0 <= nx && nx < n && 0 <= ny && ny < m && *(*field+nx*(m+1)+ny) == 'w' )
43             dfs(nx,ny,n,m,field);
44 
45 
46         }
47 
48     }
49 
50 
51 
52     }
53 void solve(int n,int m,char **field){
54     int res = 0;
55     for (int i = 0; i < n; i++){
56         for(int j = 0; j < m; j++){
57             if(*(*field+i*(m+1)+j) == 'w') {
58                 dfs(i,j,n,m,field);
59                 res++;
60             }
61         }
62 
63     }
64     printf("%d",res);
65 }
66 
67 void printAry(int n, int m, char **field){
68     for (int i = 0; i < n; i++){
69         for(int j = 0; j < m; j++){
70             printf("%c",*(*field+i*(m+1)+j)   );
71 
72         }
73         printf("\n");
74 
75     }
76 }
View Code

 

输入:

10
12
w........ww.
.www.....www
....ww...ww.
.........ww.
.........w..
..w......w..
.w.w.....ww.
w...w.....w.
.w.w......w.
..w.......w.

输出:

3


 

不确定的二维数组传参困扰了我好久,自己对指针的理解十分有限,希望找个时间好好学习下。

关于园子的列数为何设为m+1,我认为大概有一列是留给回车号的占位符的吧。

1 char field[n][m+1];//园子
2     char* p[m+1];//用指针的指针来代表二维数组