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.xdnf.cn/news/824218.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp中uview组件库的丰富Upload 上传上午用法

目录 基础用法 #上传视频 #文件预览 #隐藏上传按钮 #限制上传数量 #自定义上传样式 API #Props #Methods #Slot #Events 基础用法 可以通过设置fileList参数(数组&#xff0c;元素为对象)&#xff0c;显示预置的图片。其中元素的url属性为图片路径 <template>…

音频播放软件Foobar2000 mac特点介绍

Foobar2000 mac是一款高度可定制的音频播放器&#xff0c;适用于Windows平台。它支持各种音频格式&#xff0c;包括MP3、FLAC、AAC、WMA等&#xff0c;同时也支持各种音频插件和效果器&#xff0c;可以提供更好的音质和用户体验。 Foobar2000 mac软件特点 1. 高度可定制&#…

69内网安全-域横向CobaltStrikeSPNRDP

这节课主要讲spn和rdp协议&#xff0c; 案例一域横向移动RDP传递-Mimikatz rdp是什么&#xff0c;rdp是一个远程的链接协议&#xff0c;在linux上面就是ssh协议&#xff0c; 我们在前期信息收集的时候&#xff0c;得到一些hash值和明文密码可以进行一些相关协议的链接的&am…

【Proteus仿真】【Arduino单片机】汽车尾灯控制设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LED模块等。 主要功能&#xff1a; 系统运行后&#xff0c;系统运行后&#xff0c;系统开始运行&#xff0c;K1键控制左转向灯&#x…

【UE 游戏模板】 游戏分类(RPG、RST等)

目录 0 引言1 游戏分类1.1 角色扮演游戏&#xff08;RPG&#xff09;1.2 第一人称射击游戏&#xff08;FPS&#xff09;1.3 即时策略游戏&#xff08;RTS&#xff09;1.4 VR游戏1.5 集换式卡牌游戏&#xff08;TCG&#xff09;1.5 塔防游戏&#xff08;Tower Defense Games&…

据报道,微软的下一代 Surface 笔记本电脑将是其首款真正的“人工智能 PC”

明年&#xff0c;微软计划推出 Surface Laptop 6和 Surface Pro 10&#xff0c;这两款设备将提供 Arm 和 Intel 两种处理器选项。不愿意透露姓名的不透露姓名人士透露&#xff0c;这些新设备将引入先进的人工智能功能&#xff0c;包括配备下一代神经处理单元 (NPU)。据悉&#…

Spring Data Redis对象缓存序列化问题

相信在项目中&#xff0c;你一定是经常使用 Redis &#xff0c;那么&#xff0c;你是怎么使用的呢&#xff1f;在使用时&#xff0c;有没有遇到同我一样&#xff0c;对象缓存序列化问题的呢&#xff1f;那么&#xff0c;你又是如何解决的呢&#xff1f; Redis 使用示例 添加依…

听GPT 讲Rust源代码--src/tools(37)

File: rust/src/tools/clippy/clippy_lints/src/explicit_write.rs 在Rust源代码中&#xff0c;explicit_write.rs这个文件是Clippy的一个lint插件&#xff0c;其作用是检查代码中的write!、writeln!宏使用时的不当或繁琐的情况&#xff0c;并给出相关的警告或建议。 具体来说&…

计算机网络——计算大题(七)

前言&#xff1a; 最近也是在准备计算机考试&#xff0c;我们的考试形式是上机考试&#xff0c;所以可能有些计算题是会给提供思路的&#xff0c;前面已经对本学期的计算机网络知识有了一个简单的认识与了解&#xff0c;现在我们就来对计算大题进行一个学习吧&#xff0c;这里的…

Hive集群出现报错信息解决办法

一、报错信息&#xff1a;hive> show databases;FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient 解决办法&#xff1a;1.删除mysql中的元数据库&#xff08;metastore&#xff0…

【unity学习笔记】捏人+眨眼效果+口型效果

一、vriod捏人 1.在vroidstudio软件中捏人 2.导出模型&#xff08;.vrm) 二、vrid导入unity的插件 1.在Git上搜索、打开univrm。 2.找到release页面找到合适的插件版本。&#xff08;VRM-0.116.0_0f6c&#xff09; 3.将univrm导入到工程中&#xff08;assets&#xff09;。 三…

最新GPT4教程,GPT语音对话使用,Midjourney绘画,ChatFile文档对话总结+DALL-E3文生图教程工具

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

(学习打卡1)重学Java设计模式之设计模式介绍

前言&#xff1a;听说有本很牛的关于Java设计模式的书——重学Java设计模式&#xff0c;然后买了(*^▽^*) 开始跟着小傅哥学Java设计模式吧&#xff0c;本文主要记录笔者的学习笔记和心得。 打卡&#xff01;打卡&#xff01; 设计模式介绍 一、设计模式是什么&#xff1f; …

dash 中的模式匹配回调函数Pattern-Matching Callbacks 8

模式匹配 模式匹配回调选择器 MATCH、ALL 和 ALLSMALLER 允许您编写可以响应或更新任意或动态数量组件的回调函数。 此示例呈现任意数量的 dcc. Dropdown 元素&#xff0c;并且只要任何 dcc. Dropdown 元素发生更改&#xff0c;就会触发回调。尝试添加几个下拉菜单并选择它们的…

pytorch03:transforms常见数据增强操作

目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…

Android Studio下载gradle失败

1、打开Android Studio设置Gradle的地方&#xff0c;点击左上角的File->Settings查看gradle存放路径 C:\Users\Administrator.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx 2、找到正在下载的gradle版本&#xff0c;Android Studio取消下载gradle&…

DFS入门

theme: channing-cyan 最近有一场机试&#xff0c;已经说了重点考察dfs&#xff0c;但是对dfs还不是很熟&#xff0c;所以借由学习dfs来输出笔记&#xff0c;从而加深印象。 一.概念 dfs&#xff0c;深度搜索算法&#xff0c;又可以认为是回溯算法&#xff0c;它其实就是一个…

深入探索MySQL主从架构与读写分离:提升数据安全和性能的实战指南

一、实验目的与环境 实验目的&#xff1a; MySQL是互联网中广泛使用的开源数据库。在开发时&#xff0c;我们通常使用单机服务&#xff0c;但在生产环境中&#xff0c;由于数据量庞大和高安全性要求&#xff0c;单机MySQL无法满足这些需求。因此&#xff0c;生产环境中的MySQL需…

KG+LLM(一)KnowGPT: Black-Box Knowledge Injection for Large Language Models

论文链接&#xff1a;2023.12-https://arxiv.org/pdf/2312.06185.pdf 1.Background & Motivation 目前生成式的语言模型&#xff0c;如ChatGPT等在通用领域获得了巨大的成功&#xff0c;但在专业领域&#xff0c;由于缺乏相关事实性知识&#xff0c;LLM往往会产生不准确的…

AIGC系统ChatGPT系统源码,Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图+思维导图一站式解决方案

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…