题目来自《挑战程序设计竞赛》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 }
输入:
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];//用指针的指针来代表二维数组
浙公网安备 33010602011771号