算法刷题day32

目录

  • 引言
  • 一、走迷宫
  • 二、八数码
  • 三、走迷宫
  • 四、全球变暖

引言

本篇文章是讲 B F S BFS BFS 的,我发现好像蓝桥杯都很爱考陆地海洋的这种问题,这种问题就是即使你的模板背的再熟练,你想不到做法其实还是没啥用,所以多做题很重要,加油!


一、走迷宫

标签:BFS

思路:模板题没啥说的,这种题有些注意的地方: 1. 1. 1. 起点和终点可能是一个点。 2. 2. 2. 起点或者终点有可能就走不了。

题目描述:

给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。输入格式
第一行包含两个整数 n 和 m。接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。数据范围
1≤n,m≤100
输入样例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出样例:
8

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 110;int n, m;
int g[N][N];
int dist[N][N];int dir[4][2] = {0,1,0,-1,1,0,-1,0};int bfs()
{memset(dist, -1, sizeof dist);dist[1][1] = 0;queue<PII> q; q.push({1,1});while(q.size()){auto t = q.front(); q.pop();if(t.x == n && t.y == m) return dist[n][m];for(int i = 0; i < 4; ++i){int x = t.x + dir[i][0];int y = t.y + dir[i][1];if(x < 1 || x > n || y < 1 || y > m) continue;if(dist[x][y] != -1 || g[x][y] == 1) continue;dist[x][y] = dist[t.x][t.y] + 1;q.push({x,y});}}return -1;
}int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; ++i){for(int j = 1; j <= m; ++j){cin >> g[i][j];}}cout << bfs() << endl;return 0;
}

二、八数码

标签:BFS

思路:核心还是 B F S BFS BFS ,把这种顺序抽象成一个字符串来存,然后通过映射来找到 x x x 的横纵坐标,再对其上下左右移动,判断是否合法,用 m a p map map 来统计是否出现和交换的次数,再进行交换,入队。

题目描述:

在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。例如:1 2 3
x 4 6
7 5 8
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 3
4 5 6
7 8 x
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3   1 2 3   1 2 3   1 2 3
x 4 6   4 x 6   4 5 6   4 5 6
7 5 8   7 5 8   7 x 8   7 8 x
现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。输入格式
输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:1 2 3 
x 4 6 
7 5 8 
则输入为:1 2 3 x 4 6 7 5 8输出格式
输出占一行,包含一个整数,表示最少交换次数。如果不存在解决方案,则输出 −1。输入样例:
2 3 4 1 5 x 7 6 8
输出样例
19

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 1e5+10;int n, m;
unordered_map<string,int> mmap;
string str, E = "12345678x";int dir[4][2] = {0,1,0,-1,1,0,-1,0};PII get1(int x)
{return {x/3,x%3};
}int get2(PII x)
{return x.x*3+x.y;
}int bfs()
{mmap[str] = 0;queue<string> q; q.push(str);while(q.size()){auto t = q.front(); q.pop();if(t == E) return mmap[E];int k = t.find('x');PII t1 = get1(k); PII t2 = t1;for(int i = 0; i < 4; ++i){int x = t1.x + dir[i][0];int y = t1.y + dir[i][1];if(x < 0 || x >= 3 || y < 0 || y >= 3) continue;int k2 = get2({x,y});string tmp = t;swap(tmp[k],tmp[k2]);if(mmap.count(tmp)) continue;mmap[tmp] = mmap[t] + 1;q.push(tmp);}}return -1;
}int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);for(int i = 0; i < 9; ++i){char t; cin >> t;str += t;}cout << bfs() << endl;return 0;
}

三、走迷宫

标签:BFS

思路:其实核心跟上一题一样的,只不过要输出交换的方案,我们可以把入队的元素再加一个字符串用来表示最终的答案,根据 d i r dir dir 的移动顺序对应一个字符串的移动方案,然后其它的就跟上一题是一样的了。

题目描述:

在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。例如:1 2 3
x 4 6
7 5 8
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 3
4 5 6
7 8 x
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3   1 2 3   1 2 3   1 2 3
x 4 6   4 x 6   4 5 6   4 5 6
7 5 8   7 5 8   7 x 8   7 8 x
把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。输入格式
输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:1 2 3 
x 4 6 
7 5 8 
则输入为:1 2 3 x 4 6 7 5 8输出格式
输出占一行,包含一个字符串,表示得到正确排列的完整行动记录。如果答案不唯一,输出任意一种合法方案即可。如果不存在解决方案,则输出 unsolvable。输入样例:
2 3 4 1 5 x 7 6 8
输出样例
ullddrurdllurdruldr

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
typedef pair<string,string> PSS;
#define x first
#define y secondconst int N = 1e5+10;int n, m;
unordered_map<string,int> mmap;
string str, E = "12345678x";int dir[4][2] = {0,1,0,-1,1,0,-1,0};
string dirr[4] = {"r","l","d","u"};PII get1(int x)
{return {x/3,x%3};
}int get2(PII x)
{return x.x*3+x.y;
}string bfs()
{mmap[str] = 0;queue<PSS> q; q.push({str,""});while(q.size()){auto t = q.front(); q.pop();if(t.x == E) return t.y;int k = t.x.find('x');PII t1 = get1(k); PII t2 = t1;for(int i = 0; i < 4; ++i){int x = t1.x + dir[i][0];int y = t1.y + dir[i][1];if(x < 0 || x >= 3 || y < 0 || y >= 3) continue;int k2 = get2({x,y});string tmp = t.x;swap(tmp[k],tmp[k2]);if(mmap.count(tmp)) continue;mmap[tmp] = mmap[t.x] + 1;q.push({tmp,t.y+dirr[i]});}}return "unsolvable";
}int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);for(int i = 0; i < 9; ++i){char t; cin >> t;str += t;}cout << bfs() << endl;return 0;
}

四、全球变暖

标签:BFS

思路:在遍历每一块陆地的时候,统计该块陆地的陆地数和之后的海洋数,陆地数就是入对的个数,海洋数就是每块陆地是否有一边挨着海洋,然后看是否陆地数等于海洋数,等于最终答案加一。

题目描述:

你有一张某海域 N×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:.......
.##....
.##....
....##.
..####.
...###.
.......
其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。例如上图中的海域未来会变成如下样子:.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。输入格式
第一行包含一个整数N。以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N×N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。输出格式
一个整数表示答案。数据范围
1≤N≤1000
输入样例1:
7
.......
.##....
.##....
....##.
..####.
...###.
.......
输出样例1:
1
输入样例2:
9
.........
.##.##...
.#####...
.##.##...
.........
.##.#....
.#.###...
.#..#....
.........
输出样例2:
1

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 1010;int n, m;
char g[N][N];
bool st[N][N];int dir[4][2] = {0,1,0,-1,1,0,-1,0};bool bfs(PII S)
{st[S.x][S.y] = true;int sea = 0, oil = 1;queue<PII> q; q.push({S.x,S.y});while(q.size()){auto t = q.front(); q.pop();bool flag = false;for(int i = 0; i < 4; ++i){int x = t.x + dir[i][0];int y = t.y + dir[i][1];if(x < 0 || x >= n || y < 0 || y >= n) continue;if(st[x][y]) continue;if(g[x][y] == '.') {flag = true; continue;}oil++;st[x][y] = true;q.push({x,y});}if(flag) sea++;}return sea == oil;
}int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin >> n;for(int i = 0; i < n; ++i) cin >> g[i];int res = 0;for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){if(!st[i][j] && g[i][j] == '#'){if(bfs({i,j})) res++;}}}cout << res << endl;return 0;
}

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

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

相关文章

【LeetCode每日一题】310. 最小高度树

文章目录 [310. 最小高度树](https://leetcode.cn/problems/minimum-height-trees/)思路&#xff1a;拓扑排序代码&#xff1a; 310. 最小高度树 思路&#xff1a;拓扑排序 首先判断节点数量n&#xff0c;如果只有一个节点&#xff0c;则直接返回该节点作为最小高度树的根节点…

阿里云ECS服务器u1通用算力型CPU性能、限制使用及收费价格表

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…

【解读】Gartner 2023 DevOps平台魔法四象限

2023年6月5日Gartner发布了DevOps平台魔法四象限洞察报告&#xff08;Magic Quadrant for DevOps Platforms DevOps&#xff09;&#xff0c;Gartner指出&#xff0c;DevOps平台正在成为DevOps工具链的一种更简单的替代品&#xff0c;为组织提供一套整合的集成能力。软件工程领…

Python:文件的操作

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; Python的os库主要用于与操作系统进行交互&#xff0c;它提供了多种功能&#xff0c;使得在Python程序中处理操作系统级任务变得容易。这里是一些…

Linux文件系统中常见文件夹的作用

在Linux文件系统中&#xff0c;各个文件夹有不同的作用和用途。以下是一些常见的文件夹及其功能&#xff1a; /&#xff1a;根目录&#xff0c;整个文件系统的起始点。/bin&#xff1a;二进制可执行文件的存放目录&#xff0c;包含许多基本的系统工具和命令&#xff0c;如ls、…

05 龙芯平台openstack部署搭建-placement部署

一、创建placement相关数据库、凭据与API端点 1.创建placement数据库并授权 mysql -uroot -ploongson -e “CREATE DATABASE placement;” mysql -uroot -ploongson -e “GRANT ALL PRIVILEGES ON placement.* TO ‘placement’‘localhost’ IDENTIFIED BY ‘loongson’;” …

【Linux】Ubuntu使用Netplan配置静态/动态IP

1、说明 Ubuntu 18.04开始,Ubuntu和Debian移除了以前的ifup/ifdown命令和/etc/network/interfaces配置文件,转而使用ip link set或者/etc/netplan/01-netcfg.yaml模板和sudo netplan apply命令实现网络管理。 Netplan 是抽象网络配置描述器,用于配置Linux网络。 通过netpla…

2024全新快递平台系统独立版小程序源码|带cps推广营销流量主+前端

2024全新快递平台系统独立版小程序源码|带cps推广营销流量主前端程序源码 程序介绍 快递代发快递代寄寄件小程序可以对接易达云洋一级总代 快递小程序&#xff0c;接入云洋/易达物流接口&#xff0c;支持选择快递公司&#xff0c;三通一达&#xff0c;极兔&#xff0c;德邦等&…

适口性猫粮哪个牌子肉源好性价比高?主食冻干性价比排行前十分享

随着科学养猫知识的普及&#xff0c;主食冻干喂养越来越受到养猫人的青睐。主食冻干不仅符合猫咪的饮食天性&#xff0c;还能提供均衡的营养&#xff0c;有助于维护猫咪的口腔和消化系统健康。然而&#xff0c;许多猫主人在选择主食冻干产品时感到迷茫。本文将深入探讨如何为猫…

蓝桥杯刷题 Day36 倒计时26天 纯练题的一天

[蓝桥杯 2022 省 B] 积木画 题目描述 小明最近迷上了积木画&#xff0c;有这么两种类型的积木&#xff0c;分别为 I 型&#xff08;大小为 2个单位面积) 和 L 型 (大小为 3 个单位面积): 同时&#xff0c;小明有一块面积大小为2N 的画布&#xff0c;画布由2N 个 11 区域构成。…

一些很实用的技巧提高自动化测试覆盖率

自动化测试一直是测试人员的核心技能&#xff0c;也是测试的重要手段之一。尤其是在今年所谓的互联网寒冬的行情下&#xff0c;各大企业对测试人员的技术水平要求的很高&#xff0c;而测试人员的技术水平主要集中在三大自动化测试领域&#xff0c;再加测试辅助脚本的编写&#…

大模型知识积累——幻觉

什么是大模型幻觉 在大语言模型的文本生成场景下&#xff0c;幻觉是指一本正经的胡说八道。逻辑连贯的自然表述中&#xff0c;有理论或者事实错误&#xff0c;捏造事实等问题。 幻觉问题的危害 LLM幻觉可能产生传播错误知识的后果。对于医疗应用中结果安全和可信AI尤为重要&a…

气液分离器的概念和原理

气液分离器也叫低压储液器&#xff0c;在热泵或制冷系统中使用&#xff0c;主要是将出蒸发器、进压缩机气流中的液滴分离出来&#xff0c;防止压缩机发生液击&#xff0c;用于工质充注量较大、压缩机进气可能带液且压缩机对湿压缩较敏感的情况 。 液击主要出现在活塞式压缩机中…

PMP能两周快速通过吗?

两周时间有点赶&#xff0c;一般备考要2个月左右&#xff0c;有时间尽量多准备准备。 分享一篇左羊学霸的备考总结&#xff0c;希望能帮你 前言 作为⼀名通过PMP项⽬管理认证并且拿到3A成绩 ( PMP认证最好成绩) 的 学习者&#xff0c; 来跟⼤家分享下我考取PMP证书的动机与过程…

什么是去中心化,如何去中心化

去中心化&#xff08;Decentralization&#xff09;是指在组织、管理或运作中减少或消除中心化机构或权力的控制和影响&#xff0c;使得决策和资源分配更加分散和民主化的一种管理模式。在数字化和信息化时代&#xff0c;去中心化成为了一个重要的概念&#xff0c;尤其在区块链…

学会Python爬虫只需9步

爬虫是一种技术实现的功能&#xff0c;大部分编程语言都可以实现爬虫&#xff0c;但是对于初学者来说&#xff0c;想要快速学习爬虫技术&#xff0c;建议大家学习Python爬虫。Python编程语言相对于Java要更简单入门更容易&#xff0c;同时相对PHP使用范围更广泛&#xff0c;有利…

用户需求助力产品创新 4大注意事项

通过用户需求进行产品创新&#xff0c;是项目应遵循的原则&#xff0c;也是项目成功的关键因素之一。通过深入理解用户需求&#xff0c;有助于明确产品功能和定位&#xff0c;使得产品更符合用户期望。有助于树立正确的创新方向&#xff0c;推动企业的发展。如果不了解用户需求…

软件工程-第2章 软件过程

开发逻辑&#xff0c;是正确获取软件的关键。 2.1 软件生存周期过程 编程之前的工作。软件生存周期是软件产品或系统的一系列相关活动的全周期。95年发布国际标准&#xff0c;“ISO/IEC软件生存周期过程12207-1995”&#xff0c;给出了软件开发需要的任务&#xff0c;即回答了…

WIN10系统不定时蓝屏,终止代码:KERNEL_DATA_INPAGE_ERROR,且无法保存蓝屏日志解决办法

程序代码园发文地址&#xff1a;WIN10系统不定时蓝屏&#xff0c;终止代码&#xff1a;KERNEL_DATA_INPAGE_ERROR&#xff0c;且无法保存蓝屏日志解决办法-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,WIN10系统不定时蓝屏&#xff0c;终止代码&am…

汽车电子零部件(6):DMS/OMS、CMS

前言: 有一个部件过去不曾有,而如今有可能要标准化标配化,那就是Driver Monitoring System (DMS)驾驶员监控系统、Occupant Monitoring System (OMS)乘客监控系统和Camera Monitor System(CMS)摄像头监控系统。 汽车视觉技术的创新推动先进驾驶辅助系统的变革(ADAS),并…