DFS BFS

用DFS和BFS分别实现

//这边给出DFS的模版
void dfs(int x,int y)
{//判断是否到达终点(只有给出结束点的时候需要) if (x == ex && y == ey) {if (min_steps > step) {min_steps = step;}return;}//给出移动方向int move[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};//以当前的点为基础,开始搜索,搜索的路线为右遇到障碍物或者边界变成向下...... for (int i = 0; i < 4; ++i) {int tx = x + move[i][0], ty = y + move[i][1];if (tx < 0 || tx >= m || ty < 0 || ty >= n) continue;if (a[tx][ty] == 0 && v[tx][ty] == 0) {v[tx][ty] = 1;//走过的点打上标记,防止再走一遍 dfs(tx, ty, step + 1);v[tx][ty] = 0;//由于回溯的需要,需要接触标记,找下一条路径 }}return;	
} 

以下是完整的DFS代码

#include<bits/stdc++.h>
#define itn int
using namespace std;
int sx, sy, ex, ey;
int min_steps = 1000000;
int a[100][100];
int v[100][100];
int m, n;
void dfs(int x, int y, int step) {int move[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};if (x == ex && y == ey) {if (min_steps > step) {min_steps = step;}return;}for (int i = 0; i < 4; ++i) {int tx = x + move[i][0], ty = y + move[i][1];if (tx < 0 || tx >= m || ty < 0 || ty >= n) continue;if (a[tx][ty] == 0 && v[tx][ty] == 0) {v[tx][ty] = 1;dfs(tx, ty, step + 1);v[tx][ty] = 0;}}return;
}
int main() {cin >> sx >> sy >> ex >> ey;cin >> m >> n;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {cin >> a[i][j];}}v[sx][sy] = 1; dfs(sx, sy, 0);  cout << "Minimum steps needed: " << min_steps << endl;return 0;
}

  BFS部分:

#include<bits/stdc++.h>
#define itn int
using namespace std;
struct Queue{int x;int y;int s;
};
int a[50][50];
int vis[50][50];
int main()
{struct Queue queue[2501];int sx,sy,ex,ey,n;int flag=0;cin>>sx>>sy>>ex>>ey>>n;for (int i=0;i<n;++i){for (int j=0;j<n;++j){cin>>a[i][j];}}int tail=0,head=0;queue[tail].x=sx,queue[tail].y=sy,queue[tail].s=0;int move[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};while (head!=tail){int x=queue[head].x,y=queue[head].y;for (int i=0;i<=3;++i){int tx=x+move[i][0],ty=y+move[i][1];if (tx==ex && ty==ey){flag=1;break;}if (tx<0 || tx>=n || ty<0 || ty<=n) continue;if (a[tx][ty]==0 && vis[tx][ty]==0){vis[tx][ty]=1;queue[tail].x=tx;queue[tail].y=ty;queue[tail].s=queue[head].s+1;tail++;}}if (flag)break;head++;}cout<<queue[tail-1].s;
}

最大岛屿面积https://leetcode.cn/problems/max-area-of-island/description/

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

示例 1:

输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]
输出:6
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1

示例 2:

输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • grid[i][j] 为 0 或 1

思路:套用搜索模版,找最大的岛屿的面积,只需要便利每一个岛的面积,然后定义一个最大值变量记录最大值就可以。


//BFS
struct Queue{int x;int y;
};
int vis[55][55];
int maxAreaOfIsland(int** grid, int gridSize, int* gridColSize) {struct Queue queue[1000000];int line=gridSize;int col=*gridColSize;int head=0,tail=0;int max=0;for (int i=0;i<line;++i){for (int j=0;j<col;++j){if (grid[i][j]==1){queue[tail].x=i;queue[tail].y=j;tail++;vis[i][j]=1;int sum=1;int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};while (head!=tail){int x=queue[head].x,y=queue[head].y;for (int k=0;k<=3;++k){int tx=x+move[k][0],ty=y+move[k][1];if (tx<0 || tx>=line || ty<0 || ty>=col)continue;if (grid[tx][ty]==1 && vis[tx][ty]==0){vis[tx][ty]=1;sum++;queue[tail].x=tx;queue[tail].y=ty;tail++;}}head++;}if (max<sum)max=sum;}   }}memset(vis, 0, sizeof(vis));return max;
}
//DFS
int line ,col;
int  dfs(int ** grid,int i,int j)
{if (i<0 || j>=col || i>=line || j<0 || grid[i][j]==0) return 0 ;grid[i][j]=0;return 1+dfs(grid,i+1,j)+dfs(grid,i-1,j)+dfs(grid,i,j+1)+dfs(grid,i,j-1);
}
int maxAreaOfIsland(int** grid, int gridSize, int* gridColSize) {line=gridSize;col=*gridColSize;int max=0;for (int i=0;i<line;++i){for (int j=0;j<col;++j){if (grid[i][j]==1){int sum=dfs(grid,i,j);if (sum>max)max=sum;}}}return max;
}

填涂颜色https://www.luogu.com.cn/problem/P1162

题目描述

由数字 00 组成的方阵中,有一任意形状的由数字 11 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 22。例如:6×66×6 的方阵(�=6n=6),涂色前和涂色后的方阵如下:

如果从某个 00 出发,只向上下左右 44 个方向移动且仅经过其他 00 的情况下,无法到达方阵的边界,就认为这个 00 在闭合圈内。闭合圈不一定是环形的,可以是任意形状,但保证闭合圈内的 00 是连通的(两两之间可以相互到达)。

0 0 0 0 0 0
0 0 0 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 1 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 0 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 1 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数 �(1≤�≤30)n(1≤n≤30)。

接下来 �n 行,由 00 和 11 组成的 �×�n×n 的方阵。

方阵内只有一个闭合圈,圈内至少有一个 00。

输出格式

已经填好数字 22 的完整方阵。

输入输出样例

输入 #1复制

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

输出 #1复制

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

说明/提示

对于 100%100% 的数据,1≤�≤301≤n≤30。

思路:把1看作墙,遇到就停止搜索下去,但是要注意边界的情况,从边界开始搜索,那么剩下的0的是要变成2的。

#include<bits/stdc++.h>
using namespace std;
int a[35][35],b[35][35];
int n;
void dfs(int x, int y)
{int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};for (int i=0;i<=3;++i){int tx=x+move[i][0],ty=y+move[i][1];if (tx<0 || tx>=n || ty<0 ||ty>=n)continue;if (a[tx][ty]==0 && b[tx][ty]==0){b[tx][ty]=1;dfs(tx,ty);}}return ;
}
int main()
{cin>>n;for (int i=0;i<n;++i){for (int j=0;j<n;++j){cin>>a[i][j];}}for (int i=0;i<n;++i){if (a[i][0]==0)dfs(i,0);if (a[0][i]==0)dfs(0,i);if (a[i][n-1]==0)dfs(i,n-1);if (a[n-1][i]==0)dfs(n-1,i);}for (int i=0;i<n;++i){for (int j=0;j<n;++j){if (b[i][j]==0 && a[i][j]==0){a[i][j]=2;}}}for (int i=0;i<n;++i){for (int j=0;j<n;++j){cout<<a[i][j]<<" ";}cout<<endl;}return 0;
}

自然数的拆分问题https://www.luogu.com.cn/problem/P2404

题目描述

任何一个大于 11 的自然数 �n,总可以拆分成若干个小于 �n 的自然数之和。现在给你一个自然数 �n,要求你求出 �n 的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入格式

输入:待拆分的自然数 �n。

输出格式

输出:若干数的加法式子。

输入输出样例

输入 #1复制

7

输出 #1复制

1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

说明/提示

数据保证,2≤�≤82≤n≤8。

思路:主要掌握回溯的用法

#include<bits/stdc++.h>
using namespace std;
int a[35];
int n;
void dfs(int sum, int len, int last) {if (sum == n &&len!=1) {for (int j = 0; j < len - 1; ++j) {cout << a[j] << "+";}cout << a[len - 1] << endl;return;}for (int i = last; i <= n - sum; ++i) {a[len] = i;dfs(sum + i, len + 1, i); }
}int main() {cin >> n;dfs(0, 0, 1);return 0;
}

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

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

相关文章

php学习06-魔术常量

有九个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 LINE 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写&#xff0c;如下&#xff1a; 参考

[Angular] 笔记 20:NgContent

chatgpt: 在Angular中&#xff0c;NgContent是用于内容投影&#xff08;Content Projection&#xff09;的一个重要概念。它允许你在一个组件中插入内容&#xff0c;并将这些内容投影到另一个组件中。 当你在一个组件中使用<ng-content></ng-content>标签时&…

基于轻量级GhostNet模型开发构建生活场景下生活垃圾图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

【用户增长】引言:浅析游戏运营用户增长概念

1 游戏发行运营中的主要职能&#xff1a; ​ 一、发行运营通识l 运营介绍&#xff1a;职能分工、发行运营流程、职业发展能力及要求l 品类认知&#xff1a;行业品类布局、品类用户画像、运营节奏及特性&#xff0c;包含不同品类核心打法及长线运营思路l 海外运营&#xff1a;海…

GO学习记录 —— 创建一个GO项目

文章目录 前言一、项目介绍二、目录介绍三、创建过程1.引入Gin框架、创建main2.加载配置文件3.连接MySQL、redis4.创建结构体5.错误处理、返回响应处理 前言 代码地址 下载地址&#xff1a;https://github.com/Lee-ZiMu/Golang-Init.git 一、项目介绍 1、使用Gin框架来创建项…

论文阅读<Contrastive Learning-based Robust Object Detection under Smoky Conditions>

论文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2022W/UG2/papers/Wu_Contrastive_Learning-Based_Robust_Object_Detection_Under_Smoky_Conditions_CVPRW_2022_paper.pdf Abstract 目标检测是指有效地找出图像中感兴趣的目标&#xff0c;然后准确地确定它们…

springboot 项目新建流程

一、新建工程 二、工程建好后&#xff0c;在pom文件中加入springboot 依赖 <dependencies><!--SpringBoot启动依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>&l…

python+django在线学习教学辅助作业系统gp6yp

本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中 技术栈 后端&#xff1a;pythondjango 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.…

RobotFrameWork环境搭建及使用

RF环境搭建 首先安装python并且配置python环境变量pip install robotframeworkpip install robotframework-ride 生产桌面快捷方式 不行换豆瓣源检查一下pip list RF类库和扩展库 标准库 按F5快捷键查询&#xff0c;可以看到rf自带的库不需要额外安装这些标准库在python的 …

DragonEnglish:COCA20000+单词+释义

去年的时候接触到了 COCA20000 单词&#xff0c;对这种给单词特定顺序的方式蛮感兴趣的。因为我当时接触的版本只有单词或者单词释义的版本&#xff0c;所以我直接通过各种方式给它搭配了音标例句发音&#xff0c;然后每100个切割成1份&#xff0c;分成了 202 个文件来学习&…

超维空间S2无人机使用说明书——52、初级版——使用PID算法进行基于yolo的目标跟踪

引言&#xff1a;在实际工程项目中&#xff0c;为了提高系统的响应速度和稳定性&#xff0c;往往需要采用一定的控制算法进行目标跟踪。这里抛砖引玉&#xff0c;仅采用简单的PID算法进行目标的跟随控制&#xff0c;目标的识别依然采用yolo。对系统要求更高的&#xff0c;可以对…

项目中使用Java中List.subList()的注意事项

使用介绍 在Java中&#xff0c;subList是List接口的一个方法&#xff0c;用于获取原始列表的子列表 方法的声明如下 List<E> subList(int fromIndex, int toIndex);fromIndex&#xff1a;起始索引&#xff08;包括&#xff09;toIndex&#xff1a;结束索引&#xff08…

Activemq存储KahaDb详解

引言 ActiveMQ在不提供持久化的情况下&#xff0c;数据保存在内存中&#xff0c;一旦应用崩溃或者重启之后&#xff0c;数据都将会丢失&#xff0c;这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。 kahaDB kahaDB是一个基于文件&#xf…

WPF+Halcon 培训项目实战(10):HS组件绘制图案

文章目录 前言相关链接项目专栏运行环境匹配图片模板匹配加载模板文件运行结果 绘制十字标 WPF HS组件绘制图像绘制和生成的区别 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只…

元旦特辑:Note6---选择排序

目录 前言❌ 1. 基本思想⚠️ 2. 直接选择排序&#x1f7e2; 2.1 思路分析✳️ 2.2 代码实现❎ 2.2.1 sort.h 2.2.2 sort.c 2.2.3 test.c 2.3 问题解决❇️ 2.3.1 sort.c修改 2.4 特性总结✅ 3. 堆排序&#x1f535; 3.1 代码实现&#x1f3e7; 3.2 特性总结&…

神经元科技发布AI agent—“萨蔓莎”

今天神经元科技发布AI agent—“萨蔓莎“&#xff08;Samantha &#xff09;&#xff01; 取名“萨蔓莎”&#xff0c;是来自于一部讲述AI的电影《HER》。 电影讲述的是电影讲述男子西奥多汤布里&#xff08;Theodore Twombly&#xff0c;饰&#xff09;与拟人化萨曼莎&#…

Vue常见面试问答

vue响应式数据 vue2 Vue2 的对象数据是通过 Object.defineProperty 对每个属性进行监听&#xff0c;当对属性进行读取的时候&#xff0c;就会触发 getter&#xff0c;对属性进行设置的时候&#xff0c;就会触发 setter。 /** * 这里的函数 defineReactive 用来对 Object.def…

如何正确使用docker搭建redis服务器,安装gcc和make以及出现错误时的解决办法

搭建redis服务器 目录 搭建redis服务器 &#xff08;1&#xff09;开启docker&#xff0c;并查看是否开启成功 &#xff08;2&#xff09;启动上面创建的ssrf容器&#xff0c;并进入ssrf容器 &#xff08;3&#xff09;进入opt&#xff0c;然后下载redis-5.0.5.tar.gz &a…

Apache SSI 远程命令执行漏洞

一、环境搭建 二、访问upload.php 三、写shell <!--#exec cmd"id" --> 四、访问 如图所示&#xff0c;即getshell成功&#xff01;​

Zookeeper-Zookeeper应用场景实战

1. Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。 第三方的Java客户端API&#xff0c;比如Curator。 ZooKeeper官方的客户端API提供了基本的操作…