【NOI-题解】1586. 扫地机器人1430 - 迷宫出口1434. 数池塘(四方向)1435. 数池塘(八方向)

文章目录

  • 一、前言
  • 二、问题
    • 问题:1586 - 扫地机器人
    • 问题:1430 - 迷宫出口
    • 问题:1434. 数池塘(四方向)
    • 问题:1435. 数池塘(八方向)
  • 三、感谢

一、前言

本章节主要对深搜基础题目进行讲解,包括《1586. 扫地机器人》《1430 - 迷宫出口》《1434. 数池塘(四方向)》《1435. 数池塘(八方向)》题目。

二、问题

问题:1586 - 扫地机器人

类型:深度优先搜索


题目描述:

Mike同学在为扫地机器人设计一个在矩形区域中行走的算法,Mike是这样设计的:先把机器人放在出发点
(1,1) 点上,机器人在每个点上都会沿用如下的规则来判断下一个该去的点是哪里。规则:优先向右,如果向右不能走(比如:右侧出了矩形或者右侧扫过了)则尝试向下,向下不能走则尝试向左,向左不能走则尝试向上;直到所有的点都扫过。

Mike为了验证自己设计的算法是否正确,打算先模拟一下这个算法,每当机器人走过一个单元格时,会在单元格内标记一个数字,这个数字从 1 开始,每经过一个单元格数字会递增 1 ,直到所有的单元格都扫一遍,也就是所有的单元格都标记过数字,机器人会自动停止。

输入:

一行内有 2 个两个整数 n 和 m ,用空格隔开,分别代表矩形区域的行数(高)和列数(宽)。

1<n,m<10。

输出:

输出按题意机器人走过每个点之后,标记数字的结果,每个数字输出时场宽设置为 3。

样例:

输入:

3 4

输出:

  1  2  3  410 11 12  59  8  7  6

在这里插入图片描述
在这里插入图片描述


解题思路:

老规矩,首先读题,找出可用条件,过滤无用信息。

可能很多人看到这么长的题目,就不想做了。这也太难了。

看起来本题题目很长,实际上讲了一堆废话。

简单整理一下:

在这里插入图片描述

接下来一个一个解决问题。

  1. 首先n*m的矩形区域。1<n,m<10。

因此直接使用二维数组表示这个地图。

int n,m;
int a[20][20];
  1. 初始化:先把机器人放在出发点 (1,1) 点上,会在单元格内标记一个数字,这个数字从 1 开始。

那我们需要定义一个递归函数,这个函数的参数除了需要有x,y坐标,还有标记值k。

然后将初始值出发点 (1,1) ,标记值1,传递给递归函数即可。

void dfs(int x,int y,int k){a[x][y]=k;//赋值
}dfs(1,1,1);
  1. 右、下、左、上的顺序行走。

当选择了一个新的未访问节点后,对该节点进行标记,并递归地调用DFS函数,以该节点作为新的起始点继续探索。这一步是DFS算法递归性的体现,它确保了我们能够深入迷宫的每一个可到达角落。

	//右if(y+1<=m && a[x][y+1]==0){dfs(x,y+1,k+1);}//下if(x+1<=n && a[x+1][y]==0){dfs(x+1,y,k+1);} //左if(y-1>=1 && a[x][y-1]==0){dfs(x,y-1,k+1);} //上if(x-1>=1 && a[x-1][y]==0){dfs(x-1,y,k+1);} 

那关于这个题目的难点问题就解决完成了。


1.分析问题

  1. 已知:将一个 n×m 大小的矩形,标记一下数字。
  2. 未知:输出最终标记的结果。
  3. 关系:优先向右,如果向右不能走(比如:右侧出了矩形或者右侧扫过了)则尝试向下,向下不能走则尝试向左,向左不能走则尝试向上;直到所有的点都扫过。

2.定义变量

  • n 代表二维数组的行数,m 代表列数
  • 初始化一个20x20的二维数组,用于存储遍历过程中的标记值
// 全局变量定义
int n, m;            
int a[20][20];        

3.输入数据

  • 输入二维数组的尺寸,即行数n和列数m。
cin >> n >> m;

4.数据计算

  • 从二维数组的左上角(1,1)开始进行深度优先搜索,初始标记值为1。
    dfs(1, 1, 1);
  • 深度优先搜索函数。

void dfs(int x, int y, int k) {// 在当前位置(x, y)标记为ka[x][y] = k;// 检查右方的格子是否在范围内且未被访问过,如果是,则继续深入探索if(y + 1 <= m && a[x][y+1] == 0) {dfs(x, y+1, k+1);}// 检查下方的格子if(x + 1 <= n && a[x+1][y] == 0) {dfs(x+1, y, k+1);} // 检查左方的格子if(y - 1 >= 1 && a[x][y-1] == 0) {dfs(x, y-1, k+1);} // 检查上方的格子if(x - 1 >= 1 && a[x-1][y] == 0) {dfs(x-1, y, k+1);} 
}

5.输出结果

  • 输出遍历后的二维数组,展示每个格子被访问的顺序。
for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {// 使用setw(3)设置输出宽度,保持输出对齐美观cout << setw(3) << a[i][j];}// 每行输出结束后换行cout << endl;}

完整代码如下:

#include<bits/stdc++.h> // 引入标准库中的所有常用头文件,简化编程时的头文件包含
using namespace std;   // 使用std命名空间,可以直接调用std中的函数和对象,无需前缀// 全局变量定义
int n, m;             // n 代表二维数组的行数,m 代表列数
int a[20][20];        // 初始化一个20x20的二维数组,用于存储遍历过程中的标记值// 深度优先搜索函数
void dfs(int x, int y, int k) {// 在当前位置(x, y)标记为ka[x][y] = k;// 检查右方的格子是否在范围内且未被访问过,如果是,则继续深入探索if(y + 1 <= m && a[x][y+1] == 0) {dfs(x, y+1, k+1);}// 检查下方的格子if(x + 1 <= n && a[x+1][y] == 0) {dfs(x+1, y, k+1);} // 检查左方的格子if(y - 1 >= 1 && a[x][y-1] == 0) {dfs(x, y-1, k+1);} // 检查上方的格子if(x - 1 >= 1 && a[x-1][y] == 0) {dfs(x-1, y, k+1);} 
}int main() {// 主函数开始// 用户输入二维数组的尺寸,即行数n和列数mcin >> n >> m;// 从二维数组的左上角(1,1)开始进行深度优先搜索,初始标记值为1dfs(1, 1, 1);// 输出遍历后的二维数组,展示每个格子被访问的顺序for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {// 使用setw(3)设置输出宽度,保持输出对齐美观cout << setw(3) << a[i][j];}// 每行输出结束后换行cout << endl;}// 程序结束,返回0表示成功执行return 0; 
}

解法二

解题思路:使用方向数组

在解决迷宫问题时,方向数组用于指导搜索算法(如深度优先搜索、广度优先搜索)探索相邻的可通行格子。例如,从当前格子出发,按照方向数组中指定的偏移量,检查上下左右(或更多方向)的格子是否可通行,并决定下一步的移动方向。

通常情况下,迷宫问题中采用的坐标系与数学上的笛卡尔坐标系有所不同,通常约定:

  • y 表示横向(列),从左到右递增。
  • 表示纵向(行),从上到下递增。

按照这样的约定,迷宫中四个基本方向的坐标增量应为:

右(0, 1)
下(1, 0)
左(0, -1)
上(-1, 0)

示例:

以下是一个二维空间中表示四个基本方向(上、下、左、右)的方向数组:

int directions[4][2] = {{-1, 0},  // 上:向负x方向移动,y坐标不变{1, 0},   // 下:向正x方向移动,y坐标不变{0, -1},  // 左:向负y方向移动,x坐标不变{0, 1}    // 右:向正y方向移动,x坐标不变
};

当然也可以使用一维数组表示:

右(0, 1)、下(1, 0)、左(0, -1)、上(-1, 0)。

int fx[5]={0,0,1,0,-1};
int fy[5]={0,1,0,-1,0};

完整代码如下:

#include <bits/stdc++.h>
using namespace std;// 定义全局变量
int n, m; // 矩形网格的行数(n)和列数(m)
int a[20][20]; // 用于存储每个格子的标记值的二维数组,大小为 n × m// 定义方向数组,存储x和y坐标变化的值
int fx[5] = {0, 0, 1, 0, -1}; // 右(0, 1)、下(1, 0)、左(0, -1)、上(-1, 0)
int fy[5] = {0, 1, 0, -1, 0};// 深度优先搜索(DFS)函数
// 参数:当前格子的坐标 x, y,当前标记值 k
void dfs(int x, int y, int k) {// 将当前格子 (x, y) 的标记值更新为 ka[x][y] = k;// 遍历四个方向(右、下、左、上),按照索引 i(1~4)for (int i = 1; i <= 4; i++) {// 计算下一个待访问格子的坐标 tx 和 tyint tx = x + fx[i];int ty = y + fy[i];// 递归之前先判断,确保要访问的点的有效性// (1)坐标在矩形范围内:1 <= tx <= n 且 1 <= ty <= m// (2)该格子尚未被访问过:a[tx][ty] == 0if (tx >= 1 && tx <= n && ty >= 1 && ty <= m && a[tx][ty] == 0) {// 若满足条件,递归调用 dfs 函数,继续标记下一个格子dfs(tx, ty, k + 1);}}
}int main() {// 一、分析问题// 已知:将一个 n×m 大小的矩形,标记一下数字。// 未知:输出最终标记的结果。// 关系:优先向右,如果向右不能走(比如:右侧出了矩形或者右侧扫过了)则尝试向下,//       向下不能走则尝试向左,向左不能走则尝试向上;直到所有的点都扫过。// 二、数据定义// 已在全局变量中定义// 三、数据输入cin >> n >> m;// 四、数据计算// 为(1,1)点赋值为1dfs(1, 1, 1);// 五、输出结果for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {// 输出每个格子的标记值,格式化输出宽度为3cout << setw(3) << a[i][j];}// 每行输出结束后换行cout << endl;}return 0;
}

问题:1430 - 迷宫出口

类型:深搜 递归 广搜


题目描述:

一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n×n 的格点组成,每个格点只有 2 种状态, 0 和 1,前者表示可以通行后者表示不能通行。
同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点 A 走到点 B ,问在不走出迷宫的情况下能不能办到。
如果起点或者终点有一个不能通行(为 1),则看成无法办到。

输入:

第 1 行是一个正整数 n (1≤n≤100),表示迷宫的规模是 n×n 的。
接下来是一个n×n 的矩阵,矩阵中的元素为 0 或者 1。
再接下来一行是 4 个整数 ha la hb lb,描述 A 处在第 ha 行 第 la 列,B 处在第 hb 行 第lb 列。

输出:

能办到则输出 YES,否则输出 NO。

样例:

输入:

3
0 1 1
0 0 1
1 0 0
1 1 3 3

输出:

YES

在这里插入图片描述


解题思路:

本题是问有一个n*n的迷宫,从点 A 走到点 B ,问在不走出迷宫的情况下能不能办到。

那如何判断是否存在这一条路径是解题的关键。

其实可以像上一题一样,让点A移动,如果点A的坐标和点B的坐标重合,那就意味着存在这么一条路径。

并且本题只是问了是否存在点A到点B的路径,因此只要找到1条就可以了。


1.分析问题

  1. 已知:n*n的迷宫 ,每个格点只有 2 种状态, 0 和 1,前者表示可以通行后者表示不能通行。
  2. 未知:从点 A 走到点 B ,问在不走出迷宫的情况下能不能办到。
  3. 关系:如果起点或者终点有一个不能通行(为 1),则看成无法办到。

2.定义变量

  • 整型变量 n 存储迷宫的边长(假设为正方形迷宫)。
  • 整型变量 ha、la、hb、lb 分别存储起点和终点的行、列坐标。
  • 定义一个 n × n 的二维整型数组 mg,用于存储迷宫的格子状态,其中0表示可通行,1表示不可通行。
  • 布尔变量 pathFound 用于记录是否找到了从起点到终点的路径。
  • 定义两个一维整型数组 fx 和 fy,分别存储在遍历时x轴和y轴方向的变化值。这里定义了四个基本方向。
//二、数据定义 
int n;
int ha,la,hb,lb;
int mg[110][110];
bool pathFound =false;int fx[5]={0,0,1,0,-1};
int fy[5]={0,1,0,-1,0};

3.输入数据

  • 输入迷宫的边长 n 和迷宫数据。
  • 输入起点和终点坐标。
	//三、数据输入 cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>mg[i][j];}} cin>>ha>>la>>hb>>lb;

4.数据计算

  • 检查起点或终点是否不可通行(值为1)。若任意一个不可通行,输出 “NO”,表示无法从起点走到终点。
  • 若起点和终点均可通行,调用 dfs(ha, la) 进行深度优先搜索。
  • 根据 pathFound 的值输出结果:
    若 pathFound 为 true,输出 “YES”,表示找到了从起点到终点的路径。
    若 pathFound 仍为 false,输出 “NO”,表示未能找到从起点到终点的路径。
	//四、数据计算 //如果起点或者终点有一个不能通行(为 1),则看成无法办到if(mg[ha][la]==1 || mg[hb][lb]==1){//五、输出结果cout<<"NO";}else{dfs(ha,la); if(pathFound){//五、输出结果cout<<"YES";}else{//五、输出结果cout<<"NO";}
  • 函数 dfs(x, y) 接收当前格子的坐标 x 和 y。
  • 首先将当前格子 mg[x][y] 标记为已访问(值为1)。
  • 使用两个变量 tx 和 ty 存储下一个待探索格子的坐标。
  • 循环遍历方向数组 fx 和 fy,依次尝试向右、下、左、上移动。
  • 计算下一个待探索格子的坐标 tx 和 ty。
  • 检查新坐标是否有效(即位于迷宫范围内且未被访问过):
    如果有效且到达终点 (tx == hb 且 ty == lb),将 pathFound 设为 true 并结束搜索。
    如果有效且未到达终点,递归调用 dfs(tx, ty) 继续探索下一个格子。
  • 递归结束后,若 pathFound 仍为 false,说明从当前格子出发无法到达终点。
void dfs(int x,int y){mg[x][y]=1;//走过的路进行标记int tx,ty;//表示要探索的点for(int i=1;i<=4;i++){tx=x+fx[i];ty=y+fy[i];if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&mg[tx][ty]==0){if(tx==hb&&ty==lb){pathFound=true;}else{dfs(tx,ty);}}} 
}

完整代码如下:

#include <iostream>
using namespace std;// 二、数据定义
int n; // 迷宫的边长(假设为正方形迷宫)
int ha, la, hb, lb; // 起点和终点的行、列坐标
int mg[110][110]; // 用于存储迷宫的格子状态,0表示可通行,1表示不可通行
bool pathFound = false; // 记录是否找到了从起点到终点的路径// 方向数组,存储x和y坐标变化的值,符合迷宫问题中约定的坐标系
int fx[5] = {0, 0, 1, 0, -1}; // 右(0, 1)、下(1, 0)、左(0, -1)、上(-1, 0)
int fy[5] = {0, 1, 0, -1, 0};// 深度优先搜索(DFS)函数
// 参数:当前格子的坐标 x, y
void dfs(int x, int y) {mg[x][y] = 1; // 将当前格子标记为已访问(值为1)int tx, ty; // 表示要探索的点// 遍历四个方向(右、下、左、上),按照索引 i(1~4)for (int i = 1; i <= 4; i++) {tx = x + fx[i];ty = y + fy[i];// 检查新坐标是否有效(即位于迷宫范围内且未被访问过)if (tx >= 1 && tx <= n && ty >= 1 && ty <= n && mg[tx][ty] == 0) {// 若有效且到达终点,将 pathFound 设为 true 并结束搜索if (tx == hb && ty == lb) {pathFound = true;break;}// 若有效且未到达终点,递归调用 dfs 继续探索下一个格子else {dfs(tx, ty);}}}
}int main() {// 一、分析问题// 已知:n × n 的迷宫,每个格点只有 2 种状态,0 和 1,前者表示可以通行,后者表示不能通行。// 未知:从点 A 走到点 B,问在不走出迷宫的情况下能不能办到。// 关系:如果起点或者终点有一个不能通行(为 1),则看成无法办到。// 二、数据定义// 已在全局变量中定义// 三、数据输入cin >> n;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cin >> mg[i][j];}}cin >> ha >> la >> hb >> lb;// 四、数据计算// 如果起点或者终点有一个不能通行(为 1),则看成无法办到if (mg[ha][la] == 1 || mg[hb][lb] == 1) {// 五、输出结果cout << "NO";} else {dfs(ha, la); // 执行深度优先搜索if (pathFound) {// 五、输出结果cout << "YES";} else {// 五、输出结果cout << "NO";}}return 0;
}

问题:1434. 数池塘(四方向)

类型:深搜


题目描述:

农夫约翰的农场可以表示成 N×M个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。每一个方格或者有积水(W)或者没有积水(.)。

农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘是一系列相连的有积水的方格,每一个方格周围的四个方格都被认为是与这个方格相连的。现给出约翰农场的图样,要求输出农场上的池塘数。

输入:

第 1 行:由空格隔开的两个整数:N 和 M;
第 2…N+1 行:每行 M 个字符代表约翰农场的一排方格的状态。每个字符或者是 W 或者是 .,字符之间没有空格。
数据范围1≤N,M≤100。

输出:

输出只有1行,输出约翰农场上的池塘数。

样例:

输入:

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

输出:

13

在这里插入图片描述

解题思路:

本题是给定一个n*m的二维网格地图,每个格子要么是积水(标记为字符’W’),要么是无水区域(标记为字符’.')。要求计算出地图上的池塘(由相邻的积水格子组成)总数。

那我们可以遍历这个n*m的方格,来判断这个方格是积水还是无水。

如果当前脚下的格子是积水,那么采用深度优先搜索(DFS)遍历每个积水格子,并将其标记为已访问(避免重复计数),同时递归地访问其上下左右的相邻积水格子。每当开始一个新的DFS过程,就说明发现了一个新的池塘,池塘计数加一。

FOR 每一行 i 从 1 到 n(包括n)FOR 每一列 j 从 1 到 m(包括m)IF 当前格子 farm[i][j] 是积水 ('W')调用深度优先搜索函数 dfs(i, j),从当前位置开始探索相连的积水区域池塘计数器 c 加一,表示发现一个新的池塘END IFEND FOR
END FOR

关于dfs函数在上面已经介绍,选用其中一种方法即可。


1.分析问题

  1. 已知:n*m的矩形 ,农场的方格的状态有积水(W)或者没有积水(.) 。
  2. 未知:池塘数量c。
  3. 关系:深搜

2.定义变量

  • 全局变量定义,方便函数调用。
  • n, m 分别代表二维网格的行数和列数。
  • farm[110][110] 用来存储地图状态,‘W’ 表示积水,‘.’ 表示无水。
	int n,m, farm[110][110];
  • c 用来记录池塘的数量。
	//二、定义变量(已知、未知、关系)int c=0; 

3.输入数据

  • 首先读取地图的尺寸n和m。
  • 接着,通过两层循环读取每个格子的状态,并存储到farm数组中。
//三、输入已知cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char a;cin>>a;farm[i][j]=a;}}

4.数据计算

  • 一个两层循环遍历地图的每个格子。
  • 如果当前格子为积水,调用dfs函数,并增加池塘计数c。
//四、根据关系计算for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(farm[i][j]=='W'){dfs(i,j);++c;}}}
  • dfs函数实现了深度优先搜索,当遇到边界或非积水格子时返回,否则继续深入探索四周的格子,并将访问过的积水格子标记为.。
void dfs(int x,int y){if(x<1||x>n||y<1||y>m||farm[x][y]!='W'){return;}farm[x][y]='.';dfs(x,y+1);dfs(x+1,y);dfs(x,y-1);dfs(x-1,y);}

5.输出结果

  • 最后,输出池塘的总数量c。
//五、输出未知 cout<<c;return 0;

完整代码如下:

#include<bits/stdc++.h> // 包含大量常用头文件的预处理指令
using namespace std; // 使用std命名空间,简化标准库的使用// 全局变量定义
int n, m; // n为行数,m为列数
int farm[110][110]; // 用于存储农场地图状态的二维数组// 深度优先搜索函数,用于遍历并标记相连的积水区域
void dfs(int x, int y){// 判断当前位置是否越界或非积水区域,若是则返回if(x < 1 || x > n || y < 1 || y > m || farm[x][y] != 'W'){return;}// 将当前积水区域标记为已访问(即无水区域)farm[x][y] = '.';// 递归地访问当前位置的上、下、左、右四个相邻格子dfs(x, y+1); // 右dfs(x+1, y); // 下dfs(x, y-1); // 左dfs(x-1, y); // 上
}int main(){// 初始化池塘计数器int c = 0; // 输入农场的尺寸cin >> n >> m;// 根据输入构建农场地图for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){char a; // 临时变量存储输入字符cin >> a; // 读取当前位置的状态farm[i][j] = a; // 将状态存储到二维数组中}}// 遍历地图,使用DFS寻找并标记所有池塘for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){// 若当前位置为积水,则启动DFS,同时池塘计数加一if(farm[i][j] == 'W'){dfs(i, j);++c;}}}// 输出最终的池塘数量cout << c;return 0; // 主函数正常结束
}

问题:1435. 数池塘(八方向)

类型:深搜


题目描述:

农夫约翰的农场可以表示成 N×M(1≤N,M≤100)个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。
每一个方格或者有积水(‘W’)或者没有积水(‘.’)。农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘是一系列相连的有积水的方格,每一个方格周围的八个方格都被认为是与这个方格相连的。
现给出约翰农场的图样,要求输出农场上的池塘数。

输入:

第 1 行:由空格隔开的两个整数:N 和 M;
第 2…N+1 行:每行 M 个字符代表约翰农场的一排方格的状态。每个字符或者是 W 或者是 .,字符之间没有空格。
数据范围1≤N,M≤100。

输出:

输出只有1行,输出约翰农场上的池塘数。

样例:

输入:

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

输出:

3

在这里插入图片描述
解题思路

作为上一题的延申,进一步验证对角线上的方格即可。


完整代码如下:

#include <bits/stdc++.h> // 包含常用的STL库和一些优化的头文件
using namespace std; // 使用std命名空间,简化代码中的库函数调用// 全局变量声明
int n, m; // 分别表示农场的行数和列数
int farm[110][110]; // 二维数组用于存储农场的状态,'W'表示积水,'.'表示无积水// 深度优先搜索函数,用于遍历相连的积水区域
void dfs(int x, int y){// 检查坐标是否越界或当前位置是否为非积水区域,若是则直接返回if(x < 1 || x > n || y < 1 || y > m || farm[x][y] != 'W'){return;}// 将当前积水位置标记为已访问(无积水状态)farm[x][y] = '.';// 递归地探索当前点上下左右及对角线方向的相邻点dfs(x, y+1); // 右dfs(x+1, y); // 下dfs(x, y-1); // 左dfs(x-1, y); // 上dfs(x+1, y+1); // 右下dfs(x-1, y+1); // 左下dfs(x+1, y-1); // 右上dfs(x-1, y-1); // 左上
}int main(){// 问题分析、变量定义与输入处理// 未知数:池塘数量cint c = 0; // 输入农场的尺寸cin >> n >> m;// 输入农场的状态,存储到farm数组中for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){char a;cin >> a;farm[i][j] = a;}}// 计算过程:遍历农场,使用DFS发现并标记所有池塘for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(farm[i][j] == 'W'){ // 如果当前位置是积水dfs(i, j); // 对该位置进行DFS遍历++c; // 每次DFS完成,表示发现一个新的池塘,计数器加一}}}// 输出结果:池塘的总数量cout << c;return 0; // 程序正常结束
}

三、感谢

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/7356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端】HTML基础(3)

文章目录 前言一、HTML基础1、表格标签1.1 基本使用1.2 合并单元格 2、列表标签2.1 无序列表2.2 有序列表2.3 自定义列表 3、 表单标签2.1 form标签2.2 input标签2.3 label标签2.4 select标签2.5 textarea标签 4、无语义标签5、HTML特殊字符 前言 这篇博客仅仅是对HTML的基本结…

微服务领域的寻路者 —— Eureka深度探索与实战秘籍

文章目录 一、引言定义目标一个接地气的例子引言小结 二、Eureka架构2.1 Eureka Server一个有趣的例子2.2 Eureka Client一段简单的代码示例架构小结 三、工作流程1. 服务注册2. 心跳检测3. 服务发现4. 健康检查与失效剔除工作流程小结 四、核心机制4.1 服务注册与续约4.2 服务…

⭐⭐⭐宁波ISO9001认证:追求卓越的选择⭐⭐⭐

&#x1f308;&#x1f308;宁波ISO9001认证&#xff1a;&#x1f353;追求卓越的选择&#x1f680; &#x1f432;在追逐卓越的道路上&#xff0c;&#x1f98b;每一家企业都在寻找&#x1f426;那个能让自己腾飞&#x1f99c;的翅膀。而对我来说&#xff0c;&#x1f9a9;那个…

华为OD机试 - 分月饼 - 递归(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

Splay 树简介

【Splay 树简介】 ● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级&#xff0c;实现概率上的平衡。Splay 树直接用旋转调整树的形态&#xff0c;通过旋转改善树的平衡性。计算量小&#xff0c;效果好。 ● Splay 树的旋转主要分为“单旋”和“双旋”。 所谓“单旋”…

代码审计之浅谈RASP技术

前言&#xff1a; 想摆会烂&#xff0c;所以就落个笔吧。 其实本来是想写关于iast技术的&#xff0c;但是认真思考了下&#xff0c;感觉笔者自己本身也不太能讲清楚iast技术&#xff0c;怕误人子弟。 所以最后还是基于笔者的理解以及实际应用写一篇关于RASP技术的文章&#xf…

强化学习:时序差分法【Temporal Difference Methods】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

软件游戏丢失XINPUT1_4.dll文件的多种解决方法分享

当玩家在尝试启动某款游戏时&#xff0c;遇到了系统提示“游戏找不到XINPUT1_4.dll”&#xff0c;这个错误通常发生在玩家尝试启动游戏时&#xff0c;游戏无法找到所需的XINPUT1_4.dll文件&#xff0c;呆滞无法正常启动运行。但是幸运的是&#xff0c;有一些简单的修复方法可以…

软件测试与管理:黑盒测试-因果图法和场景法

知识思维导图&#xff1a; ​​​​​​​ 例题1&#xff1a;运用因果图法设计测试用例 有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计。其规格说明如下&#xff1a; 若投入5角钱或1元钱的硬币&#xff0c;按下〖橙汁〗或〖啤酒〗的按钮&#xff0c;则相应的饮料…

[方法] Unity 实现仿《原神》第三人称跟随相机 v1.1

参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…

4步快速配置Java和MySQL环境

每次入职一家新公司或者用一台其他的临时电脑或者新电脑时都要重新配置Java开发环境&#xff0c;很麻烦&#xff0c;因此我在这里记录一下快速配置环境的方式&#xff0c;四步搞定&#xff01;此处以win为操作系统进行讲解。 第一步&#xff1a;下载链接 下载链接&#xff1a…

04.1.添加多个监控同步其他主机

添加多个监控&同步其他主机 1.首先在agent配置文件中存在Include的&#xff0c;也就是说明&#xff0c;可以配置多个监控项并且同步到其他主机上的进行使用&#xff1b; 2.主机之间互相推送配置文件即可&#xff1b; 开始测试 我这里实在agent节点上直接在路径/etc/zabbi…

Go实现树莓派控制舵机

公式说明 毫秒&#xff08;ms&#xff09;是时间的单位&#xff0c;赫兹&#xff08;Hz&#xff09;是频率的单位&#xff0c;而DutyMax通常是一个PWM&#xff08;脉冲宽度调制&#xff09;信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式&#xff1a; 频率&…

设计模式之建造者模式BuilderPattern(七)

一、建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 二、代码实例 1、OrderItem类 Data&#xff1a;这是Lombok中提供的Ge…

ADS过孔---过孔建模自动化

当前快速建模的方法有两类&#xff1a;一是脚本自动化&#xff0c;也就是今天要分享的方法&#xff0c;但该方法需要工程师有基本的脚本编辑能力&#xff0c;然后根据自己的需要去修改&#xff0c;难度较大一点点&#xff1b;二是参数化建模&#xff0c;也就是在GUI界面输入相应…

百度语音识别开发笔记

目录 简述 开发环境 1、按照官方文档步骤开通短语音识别-普通话 2、创建应用 3、下载SDK 4、SDK集成 5、相关接口简单说明 5.1权限和key 5.2初始化 5.3注册回调消息 5.4开始转换 5.5停止转换 6、问题 简述 最近想做一些语音识别的应用&#xff0c;对比了几个大厂…

华为手机连接电脑后电脑无反应、检测不到设备的解决方法

本文介绍华为手机与任意品牌电脑连接时&#xff0c;出现连接后电脑无反应、检测不到手机连接情况的解决方法。 最近&#xff0c;因为手机的存储空间愈发紧缺&#xff0c;所以希望在非华为电脑中&#xff0c;将华为手机内的照片、视频等大文件备份、整理一下。因此&#xff0c;需…

aardio爬虫) 实战篇:逆向有道翻译web接口

前言 之前的文章把js引擎(aardio封装库) 微软开源的js引擎(ChakraCore))写好了&#xff0c;这篇文章整点js代码来测一下bug。测试网站&#xff1a;https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻译js逆向&#xff08;MD5加密&#xff0c;AES加密&…

cmake进阶:定义函数的内部变量

一. 简介 前一篇文章学习 cmake中的定义函数基本用法。文章如下&#xff1a; cmake进阶&#xff1a;定义函数的使用方法-CSDN博客 本文继续学习 cmake中的定义函数&#xff0c;主要学习函数的内部变量。 二. cmake进阶&#xff1a;定义函数的内部变量 上一篇文章说过&…

Elasticsearch:理解人工智能相似性搜索

理解相似性搜索&#xff08;也称为语义搜索&#xff09;的指南&#xff0c;这是人工智能最新阶段的关键发现之一。 最新阶段人工智能的关键发现之一是根据相似性搜索和查找文档的能力。相似性搜索是一种比较信息的方法&#xff0c;其基于含义而非关键字。 相似性搜索也被称为语…