第十一届蓝桥杯(国赛)——扩散(BFS)

题目链接:第十一届蓝桥杯大赛软件赛决赛 C++ B组

首先看到 我们都能想到去运用BFS + bool[N][N]去直接进行暴力破解,但是这个黑色点是会向负方向轴去运动的,而我们开的数组如果用了负数就是数组越界,导致该题解不出来,所以这题就需要去转换思路

-------------------------------------------------------------------------------
Tip1.将坐标轴进行移动
每次我们的x , y其中之一为负数时,我们就将他加上一个数,使他的表达值为正数去用bool记忆,但这次我们不重点讲这种方法
-------------------------------------------------------------------------------
Tip2.用map<pair<int,int>,bool>
当我们用两个点来表示一个坐标的时候,就不会出现数组越界的情况,因为我们根本没用数组
我们用map<pair<int,int>,bool>来代替bool,这样子就能代替一个二维bool数组。然后我们开两个队列queue<point>q[2];,比如说我们刚开始储存进来4个点的是q[1],那么在q[1]进行运算时,我们储存不再储存到q[1]而是q[0]。再各运用完q[1],q[0] 2020次后,我们的bfs就走完了,最后输出mp.size();即使最终答案

核心代码

while(cnt <= 2020){
		while (q[cnt & 1].size()) { //cnt & 1:表示cnt 奇数结果为0,偶数结果为1
			point u = q[cnt & 1].front(),v;
			q[cnt & 1].pop();
			for (int i = 0; i < 4; ++i) {
				v.x = u.x + dx[i];
				v.y = u.y + dy[i];
				if (!mp[make_pair(v.x, v.y)]) {
					mp[make_pair(v.x, v.y)] = true; //map里面的bool数组记忆
					q[(cnt & 1) ^ 1].push(v); //(cnt & 1) ^ 1 表示cnt奇数结果为1,偶数结果为0
				}
			}
		}	
		cnt ++; //每走完一分钟 cnt+1 走完2020分钟 结束bfs
	}

完整代码

#include <iostream>
#include <map>
#include <queue>

using namespace std;

struct point{
	int x,y;
}start;
map<pair<int,int>,bool>mp;
queue<point>q[2];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
 
int main(){
	//将题目给的四个点存入队列中
	mp[make_pair(0,0)] = true;
	start.x = 0,start.y = 0;
	q[0].push(start);
	mp[make_pair(2000,2000)] = true;
	start.x = 2000,start.y = 2000;
	q[0].push(start);
	mp[make_pair(11,14)] = true;
	start.x = 11,start.y = 14;
	q[0].push(start);
	mp[make_pair(2020,11)] = true;
	start.x = 2020,start.y = 11;
	q[0].push(start);
	
	int cnt = 0;
	
	while(cnt <= 2020){
		while (q[cnt & 1].size()) { //cnt & 1:表示cnt 奇数结果为0,偶数结果为1
			point u = q[cnt & 1].front(),v;
			q[cnt & 1].pop();
			for (int i = 0; i < 4; ++i) {
				v.x = u.x + dx[i];
				v.y = u.y + dy[i];
				if (!mp[make_pair(v.x, v.y)]) {
					mp[make_pair(v.x, v.y)] = true; //map里面的bool数组记忆
					q[(cnt & 1) ^ 1].push(v); //(cnt & 1) ^ 1 表示cnt奇数结果为1,偶数结果为0
				}
			}
		}	
		cnt ++; //每走完一分钟 cnt+1 走完2020分钟 结束bfs
	}
	cout << mp.size();
}

最终答案:20312088

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第十届蓝桥杯人物相关性目是一道经典的编程问,要求我们在给定的人物关系图中,判断两个人物之间是否存在一条关系链,即判断两个人物是否直接或间接地相关。 在这道目中,我们可以使用图的搜索算法来解决问。一种常见的算法是深度优先搜索(DFS),另一种是广度优先搜索(BFS)。 大概的思路是:首先,我们需要构建人物关系图,可以通过邻接矩阵、邻接表等数据结构来存储图的信息。然后,我们选择一个起始节点,从该节点开始进行搜索。如果在搜索的过程中找到了目标节点,即两个人物之间存在直接关系,那么我们可以结束搜索并返回结果。如果没有找到目标节点,则需要继续深入搜索,或者在广度搜索中扩展搜索队列。如果最终搜索完整个图都没有找到目标节点,那么可以判定两个人物之间不存在关系链。 具体实现时,可以使用递归或者栈来实现DFS,使用队列来实现BFS。在DFS中,我们可以利用函数的递归调用来实现深度搜索;在BFS中,我们可以通过队列不断地将待搜索节点加入队列,实现广度搜索。 总的来说,第十届蓝桥杯人物相关性目考察了对图的数据结构和搜索算法的掌握程度。需要我们理解并实现图的构建和搜索过程,进而判断两个人物之间的相关性。这道目不仅考察了编程基础知识,也锻炼了问分析和解决能力,是一道非常有挑战性的编程目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值