/** * 判断岛屿数量 * @param grid char字符型二维数组 * @param gridRowLen int grid数组行数 * @param gridColLen int* grid数组列数 * <a href="/profile/756076230" data-card-uid="756076230" class="js-nc-card" target="_blank" from-niu="default">@return int整型 */ void dfs(char** grid, int i,int j,int gridRowLen,int* gridColLen) { int k,l; grid[i][j]='0'; //把所有的1都变成0 for(k=-1;k<2;k++) //-1,0,1 行 向左,不动,向右三种情况,这样写可以省去很多代码 { for(l=-1;l<2;l++) { if(k==0&&l==0) // //横纵坐标不变 continue; if(i+k>=0&& i+k<=gridRowLen-1 &&j+l>=0 && j+l<=gridColLen[i]-1) { if(grid[i+k][j+l]=='1') dfs(grid, i+k,j+l,gridRowLen,gridColLen); } } } } int solve(char** grid, int gridRowLen, int* gridColLen ) { // write code here //其实这题类似与水洼题 //1代表是陆地,0代表海洋,尝试把所有的1都变成0就可以完成 int count=0; //计数 int i,j; for(i=0;i<gridRowLen;i++) { for(j=0;j<gridColLen[i];j++) { if(grid[i][j]=='1') { dfs(grid,i,j,gridRowLen,gridColLen); count++; } } } return count; } </a>
有一个大小为NxM的园子,兩后积起了水。八连通的积水被认为是连接在一起的。请求出 园子里总共有多少水洼? (八连通指的是 下图中相对W的*的部分) (就是W是积水,以w为中心的八个方向找,分别八个方向都没w为止) *** *w* *** I 限制条件 N, M<=100 样例: 输入 N=10, M=12 园子如下图('W'表示积水,'. '表示没有积水) W........WW. .WWW.....WWW ....WW...WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W. 输出3 水洼的思路就是找到W把W消成. 并且不用回溯,因为已经全部变成点了 //#define M 12 //#define N 10 int N,M; void dfs(char a[][12],int i,int j) { a[i][j] = '.'; //把w变成点 for (int k = -1; k < 2; k++) {//-1,0,1 行 向左,不动,向右三种情况 for (int L = -1; L < 2; L++) {//-1向上,0不动,1向下 if (k == 0 && L== 0) continue; //横纵坐标不变没变的 if (i + k >= 0 && i + k <= N - 1 && j + L >= 0 && j + L <= M - 1) {//i+k是行数,j+L是列数 if (a[i + k][j + L] == 'W') dfs(a, i + k, j + L); //新的坐标 } } } } int main() { scanf("%d%d",&N,&M); char a[10][12]; for(int i=0;i<N-1;i++) { scanf("%s",a[i]); //一行一行相当于字符串一行一行的输入 } //找有w的点 int count=0; for(int i=0;i<N;i++) { for(int j=0;j<M;j++) { if(a[i][j]=='W') { dfs(a,i,j); //找一个起点开始清除一个水洼 count++; } } } printf("\n水洼数=%d\n",count); }