【BFS广度优先搜索专题】【蓝桥杯备考训练】:母亲的牛奶、走迷宫、八数码1、八数码2、全球变暖【已更新完成】

目录

1、母亲的牛奶(usaco training 1.5)

2、走迷宫(模板)

3、八数码1(模板)

4、八数码2(《算法竞赛进阶指南》& HDU1043)

5、全球变暖(第九届蓝桥杯省赛C++ & JAVA  A组/B组)


1、母亲的牛奶(usaco training 1.5)

农夫约翰有三个容量分别为 A,B,C 升的挤奶桶。

最开始桶 A 和桶 B 都是空的,而桶 C 里装满了牛奶。

有时,约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。

这一过程中间不能有任何停顿,并且不会有任何牛奶的浪费。

请你编写一个程序判断,当 A 桶是空的时候,C 桶中可能包含多少升牛奶,找出所有的可能情况。

输入格式

共一行,包含三个整数 A,B,C

输出格式

共一行,包含若干个整数,表示 C 桶中牛奶存量的所有可能情况,请将这些数字按升序排列。

数据范围

1≤A,B,C≤20

输入样例1:
8 9 10
输出样例1:
1 2 8 9 10
输入样例2:
2 5 10
输出样例2:
5 6 7 8 9 10
思路:

枚举每一种情况,存到vis[][][]数组中,最后进行遍历,把a=0的情况输出出来

代码:
#include<bits/stdc++.h>using namespace std;const int N=25;int A,B,C;//容量 int cc=C,ca=0,cb=0;//c桶7装满了奶,而a桶和b桶是空的bool vis[N][N][N];int hh,tt;
struct node 
{int a,b,c;
}q[N*N*N];void insert(int a,int b,int c)
{if(!vis[a][b][c]){q[++tt]={a,b,c};vis[a][b][c]=true;	}
}void bfs()
{q[0]={0,0,C};vis[0][0][C]=true;while(hh<=tt){auto t=q[hh++];int a=t.a;int b=t.b;int c=t.c;//a to b insert(a - min(a ,B - b),min(a + b, B ), c);//a to cinsert(a - min(a, C - c), b, min(C , c + a));//b to a;insert(min(A,a+b),b-min(b,A-a),c);//b to cinsert(a,b-min(b,C-c),min(c+b,C));//c to a;insert(min(A,a+c),b,c-min(A-a,c));//c to binsert(a,min(b+c,B),c-min(B-b,c));}}int main()
{cin>>A>>B>>C;//cout<<A<<B<<C;bfs();//cout<<vis[0][9][1];for(int i=0;i<=C;i++)for(int j=0;j<=B;j++)if(vis[0][j][i]){cout<<i<<" ";}return 0;
} 

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
思路:

经典的广度优先搜索模板,不过这次vis数组不仅用来记录是否访问,还用来记录步数

代码:
#include<bits/stdc++.h>using namespace std;const int N=103;int n,m;typedef pair<int,int> PII; int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};int g[N][N];
int vis[N][N];int hh=0,tt=0;
PII q[N*N];void bfs()
{q[0]={1,1};while(hh<=tt){PII t=q[hh++];//popfor(int i=0;i<4;i++){int nx=t.first+dx[i];	int ny=t.second+dy[i];if(nx>=1 && ny>=1 && nx<=n && ny<=m && vis[nx][ny]==-1 && g[nx][ny]==0){vis[nx][ny]=vis[t.first][t.second]+1;q[++tt]={nx,ny};//enqueue}}	}	}int main()
{cin>>n>>m;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//千万别忘了memsetmemset(vis,-1,sizeof vis);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&g[i][j]);}//read graphbfs(); cout<<vis[n][m]+1;return 0;	
} 
/*
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 08*/

3、八数码1(模板)

在一个 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
思路:

数组中x的位置索引k可以转化出x在二维数组中的坐标:

x=k/3,y=k%3

代码:
#include<bits/stdc++.h>using namespace std;string start;int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};//2 3 4 1 5 x 7 6 8//19int bfs(string start)
{//if(start==end)return d[] 不小心写递归了string end="12345678x";unordered_map<string,int>d;d[start]=0;//初始步数为0;queue<string>q;q.push(start);while(q.size()){string t=q.front();q.pop();int distance=d[t];//int cnt1=0;//for(int i=0;i<3;i++)//{//for(int j=0;j<3;j++)//{//cout<<t[cnt1++]<<" ";//}//cout<<endl;//}//cout<<endl;//cout<<d[t]<<endl;if(t==end)return distance;int k=t.find('x');int x=k/3;int y=k%3;//转化出'x'的位置 for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];//cout<<dx[i]<<" "<<dy[i]<<endl;//cout<<nx<<" "<<ny<<endl;if(nx>=0 && nx<=2 && ny>=0 && ny<=2  ){//cout<<k<<" "<<nx*3+y<<endl;swap(t[k],t[nx*3+ny]);//cout<<"new"<<endl; if(!d.count(t)){	d[t]=distance+1;q.push(t);}swap(t[k],t[nx*3+ny]);}	}//cout<<-1;} return -1;}int main()
{string start="";for(int i=0;i<9;i++){char c;cin>>c;start+=c;}cout<<bfs(start);return 0;	
} 

4、八数码2(《算法竞赛进阶指南》& HDU1043)

在一个 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 与上下左右方向数字交换的行动记录为 udlr

现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。

输入格式

输入占一行,将 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
思路:

升级版的八数码1,这次新增两个表即可:用哈希表pre来记录状态转移,再开一个哈希表记录每个状态对应的步数即可

代码:
#include<bits/stdc++.h>using namespace std;string s;unordered_map<string,string>pre;unordered_map<string,char>h;char oper[]="udlr";
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};unordered_set<string>st;queue<string>q;
//2 3 4 1 5 x 7 6 8
//1 2 3 4 5 6 x 7 8 
//ullddrurdllurdruldr
// u d l r
bool bfs()
{string end="12345678x";q.push(s);st.insert(s);while(q.size()){auto t=q.front();if(t==end)return true;q.pop();auto cur=t;int k=t.find('x');int x=k/3;int y=k%3;for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];swap(t[k],t[nx*3+ny]);if(nx>=0 && ny>=0 && nx<=2 && ny<=2 && pre.find(t)==pre.end()){q.push(t);pre[t]=cur;h[t]=oper[i];}swap(t[k],t[nx*3+ny]);}}return false;
}int main()
{string res;for(int i=0;i<9;i++){char c;cin>>c;s+=c;	} if(!bfs())cout<<"unsolvable";else{string t="12345678x";while(true){if(t==s){break;}res=h[t]+res;t=pre[t];}}cout<<res;return 0;
}

5、全球变暖(第九届蓝桥杯省赛C++ & JAVA  A组/B组)

你有一张某海域 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> 
#define x first
#define y second
using namespace std;
char arr[1010][1010];
bool finddao[1010][1010];
int N;
bool bfs(pair<int,int>s1){int sum=0;//计算不被海水侵蚀的路地块个数bool mark;//用于判断是否被侵蚀int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//初始化偏移量queue<pair<int,int>>dui;dui.push(s1);while(dui.size()){auto s2=dui.front();dui.pop();mark=1;for(int i=0;i<4;i++){int x1=s2.x+dx[i],y1=s2.y+dy[i];if(x1<0||x1>=N||y1<0||y1>=N)continue;if(arr[x1][y1]=='.'){mark=0;continue;}if(finddao[x1][y1])continue;finddao[x1][y1]=true;dui.push(make_pair(x1,y1));}if(mark==1)sum++;}if(sum>=1)//如果岛上有不被侵蚀的路地块那么这岛能存活return 1;else return 0;
}
int main(){int allisland=0,lifeisland=0;pair<int,int> s1;cin>>N;for(int i=0;i<N;i++)cin>>arr[i];for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(arr[i][j]=='#'&&!finddao[i][j]){s1={i,j};allisland++;//计算所有岛的数目lifeisland+=bfs(s1);//计算能存活的岛}}}cout<<allisland-lifeisland;//用所有的岛数目减能留下的岛数目剩下就是沉下的岛return 0;
}

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

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

相关文章

企业如何利用数字工厂管理系统打造自动化产线

随着信息技术的飞速发展&#xff0c;数字化转型已成为企业提升生产效率、降低成本、优化管理的重要手段。数字工厂管理系统作为数字化转型的核心组成部分&#xff0c;其在打造自动化产线方面的作用日益凸显。本文将探讨企业如何利用数字工厂管理系统打造自动化产线&#xff0c;…

【QED】斐波那契游戏

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 总结 题目 题目链接&#x1f517; 斐波那契数列指的是这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#x…

边缘自动隐藏窗体,透明度切换,同步父窗体标签切换winform

一、实现功能 默认的标签栏(superTabControl) 可以设置隐藏,即可实现全屏最大化。通过列表切换打开的标签页。用于定制B/S模式系统显示更个性,自定义样式,简介 安全 兼容性好。 二、主要代码 private void Time_Tick(object sender, EventArgs e) {获取主屏

亚马逊AWS展示高效纠错的全新量子比特!

亚马逊网络服务公司&#xff08;AWS&#xff09;在量子计算的纠错技术领域取得了显著成就&#xff0c;极大地简化了量子系统的复杂性和资源需求。他们的研究人员通过采用“双轨擦除”量子比特&#xff08;dual-rail erasure qubit&#xff09;技术&#xff0c;有效地克服了量子…

推荐一种Bean注入方式——开发经验

我们都知道三种Bean注入的方式分别是属性注入&#xff0c;setter方法注入&#xff0c;构造器注入。这三种Bean注入的方式各有优缺点&#xff0c;但是相对来说更推荐使用构造器注入的方式。 1、构造器注入的优缺点 优点&#xff1a; 1、可以注入不可变对象 因为构造方法注入是…

算法-图的强连通分量,图的最小生成树

1.图的强连通分量 (1). 定义 图的强连通分量是图论中的一个重要概念&#xff0c;主要在有向图中进行讨论。具体来说&#xff0c;如果在一个有向图G中&#xff0c;任意两个顶点vi和vj&#xff08;其中vi大于vj&#xff09;之间都存在一条从vi到vj的有向路径&#xff0c;同时也存…

分享基于PDF.js的pdf阅读器代码

一、前言 有时候开发PC端web页面的时候会遇到PDF预览、下载等功能&#xff0c;为了兼容浏览器&#xff0c;需要找一款前端插件进行开发。比较好的PDF插件&#xff0c;就是mozilla的pdf.js&#xff08;注意是mozilla&#xff0c;如果你百度遇到需要收费的&#xff0c;那应该是下…

python矢量算法-三角形变化寻找对应点

1.算法需求描述 现有随机生成的两个三角形A与B&#xff0c;在三角形A中存在Pa&#xff0c;使用算法计算出三角形B中对应的点Pb 2.python代码 import numpy as np # 计算三角形A的面积 def area_triangle(vertices): return 0.5 * np.abs(np.dot(vertices[0] - vertices[…

品时尚精酿啤酒,探秘时尚背后的故事

在琳琅满目的啤酒市场中&#xff0c;Fendi Club啤酒以其时尚的风格和品质&#xff0c;成为了引人注目的焦点。这款啤酒不仅是一种味觉的享受&#xff0c;更是一种时尚与品味的象征。接下来&#xff0c;让我们一起探索Fendi Club啤酒背后的故事。 一、Fendi Club啤酒的特色 Fen…

师徒互电,眼冒金星,采集系统变电刺激系统!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;很高兴分享我的原创文章&#xff0c;喜欢和支持我的工程师&#xff0c;一定记得给我点赞、收藏、分享哟。 加微信[chunhou0820]与作者进群沟通交流 电的我眼冒金星&#xff0c;以为自己被三体召唤&#xff0c;整个世界为我…

什么是浏览器指纹识别?Maskfog指纹浏览器有用吗?

浏览器指纹识别是好是坏&#xff1f;这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么&#xff0c;那就看下去&#xff01; 一、什么是浏览器指纹识别 浏览器指纹是指无…

Jenkins构建时报错:Build step ‘Execute shell‘ marked build as failure

1.磁盘空间不足导致报错。 2.默认情况下&#xff0c;Jenkins采取 /bin/sh -xe 这种方式 -x 将打印每一个命令&#xff1b;另一个选项 -e&#xff0c;当任何命令以非零值&#xff08;当任何命令失败时&#xff09;退出代码时&#xff0c;这会导致shell立即停止运行脚本。 解决…

Spark重温笔记(二):快如闪电的大数据计算框架——你真的了解SparkCore的 RDD 吗?(包含企业级搜狗案例和网站点击案例)

Spark学习笔记 前言&#xff1a;今天是温习 Spark 的第 2 天啦&#xff01;主要梳理了 Spark 核心数据结构&#xff1a;RDD(弹性分布式数据集)&#xff0c;其中包括基于内存计算的 SparkCore 各类技术知识点希望对大家有帮助&#xff01; Tips&#xff1a;"分享是快乐的源…

鸿蒙一次开发,多端部署(四)工程管理

DevEco Studio的基本使用&#xff0c;请参考DevEco Studio使用指南。本章主要介绍如何使用DevEco Studio进行多设备应用开发。 说明&#xff1a; 本章的内容基于DevEco Studio 3.1.1 Release版本进行介绍&#xff0c;如您使用DevEco Studio其它版本&#xff0c;可能存在文档与产…

《妈妈是什么》笔记(一)孩子都有被关注的需求

简介 作者渡渡鸟&#xff0c; 其本名韩谨&#xff0c;微博原创育儿理念、故事、分享妈妈经。毕业于中国社科院哲学系&#xff0c;有过八年记者生涯。育有一儿两女&#xff0c;在中美两国生活&#xff0c;熟悉跨文化养育&#xff0c;有坚定的根文化意识。 渡渡鸟妈妈能够基于孩…

docker基础超详细教程,一篇文章帮助你从零开始学习docker,从入门到实战

docker 概述 docker 官网&#xff1a;http://www.docker.com 官网文档&#xff1a; https://docs.docker.com/get-docker/ Docker Hub官网&#xff1a;https://hub.docker.com &#xff08;仓库&#xff09; 什么是 docker docker 是一个开源的容器化平台&#xff0c;可以…

Python螺旋折线蓝桥杯(来源lanqiao.cn 题目176) 时间超限

题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y)&#xff0c;我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y)&#xff0c;你能计算出dis(X, Y)吗&#xff1f; 输入格式 …

js【详解】typeof 运算符

typeof()表示“获取变量的数据类型”&#xff0c;返回的是小写&#xff0c;语法为&#xff1a;&#xff08;两种写法都可以&#xff09; // 写法1 typeof 变量;// 写法2 typeof(变量); typeof 这个运算符的返回结果就是变量的类型。 返回结果&#xff1a; typeof 的代码写法…

Swift 中的 Sequence 是什么 ?

在 Swift 中&#xff0c;Sequence 是一个协议&#xff0c;它表示一个可以遍历其元素的集合类型。任何遵循 Sequence 协议的类型都必须提供一个迭代器&#xff0c;用于按顺序访问其元素。迭代器是通过 makeIterator() 方法获取的&#xff0c;该方法返回一个遵循 IteratorProtoco…

【数组、字符串】算法例题

每个题的【方法1】是自己的思路&#xff0c;【其他方法】是力扣上更优的解题思路 目录 一、数组、字符串 1. 合并两个有序数组 ① 2. 移除元素 ① 3. 删除有序数组中的重复项 ① 4. 删除有序数组中的重复项 II ② 5. 多数元素 ① 6. 轮转数组 ② 7. 买卖股票的最佳时机…