#岛屿问题/水洼问题/dfs#
/** * 判断岛屿数量 * @param grid char字符型二维数组 * @param gridRowLen int grid数组行数 * @param gridColLen int* grid数组列数 * @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; }
有一个大小为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);
}
C语言刷题 文章被收录于专栏
自己从头开始刷的C语言
查看1道真题和解析
小天才公司福利 1326人发布