/**
* 判断岛屿数量
* @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);
}