当前位置: 首页 > news >正文

信息学奥赛一本通 1347:【例4-8】格子游戏

【题目链接】

ybt 1347:【例4-8】格子游戏

【题目考点】

1. 并查集:判断无向图是否有环

【解题思路】

该题为判断无向图是否有环。可以使用并查集来完成。

学习并查集时,每个元素都由一个整数来表示。而该问题中每个元素是一个坐标点,由(x, y)两个整数构成。
因而有两种方法解决该问题

解法1:将二维坐标变为一个整数

通过一个公式将二维坐标换算为一个整数,用这个整数代表该二维坐标。

例:假设坐标点是2行3列的,每个位置的坐标为x, y,转变后的数字为d,记为(x, y):d

第1列第2列第3列
第1行(1,1):1(1,2):2(1,3):3
第2行(2,1):4(2,2):5(2,3):6

可以推出n行n列的坐标系中,坐标(x,y)转为数字d,公式为:d=(x−1)⋅n+yd=(x-1)\cdot n+yd=(x1)n+y
把每个坐标都用一个数字表示。
每输入一个坐标(x,y),求出其对应的数字f。

  • 如果接下来输入字母D,即向下画,那么与(x,y)连接的点是(x+1, y),求出其对应的数字t。
  • 如果接下来输入字母R,即向右画,那么与(x,y)连接的点是(x, y+1),求出其对应的数字t。

判断f和t是否在一个集合(连通子图)中

  • 如果是,那么f与t连边会形成环,游戏结束。输出游戏结束时的步数。
  • 否则把f和t所在的集合合并。

解法2:直接使用坐标作为并查集中的元素

如果并查集中的元素不为整数,可以将fa数组改为映射(map类型),同时find、merge都发生改变。
解题思路与解法1类似。
在输入时,使用find直接判断两个数对元素是否在一个集合中

  • 如果已在一个集合中,说明两点间有路径连通,再加一条边就会形成环。
  • 否则,使用merge把两个数对元素所在的集合进行合并。

【题解代码】

解法1:将二维坐标变为一个整数

#include<bits/stdc++.h>
using namespace std;
#define N 40005
int fa[N], n, m;
int getNum(int x, int y)//用1个数字代表二维的坐标点 
{return (x-1)*n + y;
}
void init(int n)
{for(int i = 1; i <= n; ++i)fa[i] = i;
}
int find(int x)
{if(x == fa[x])return x;elsereturn fa[x] = find(fa[x]);
}
void merge(int x, int y)
{ fa[find(x)] = find(y);
}
int main()
{int x, y, i, f, t;char c;cin >> n >> m;init(n*n);for(i = 1; i <= m; ++i)//i:第几步 {cin >> x >> y >> c;f = getNum(x, y);if(c == 'D')t = getNum(x+1, y);else//c == 'R't = getNum(x, y+1);if(find(f) == find(t))break;elsemerge(f, t);}if(i <= m)cout << i;elsecout << "draw";return 0;
}

解法2:直接使用坐标作为并查集中的元素

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> Pair;
map<Pair, Pair> fa;
Pair find(Pair x)
{if(x == fa[x])return x;elsereturn fa[x] = find(fa[x]);
}
void merge(Pair x, Pair y)
{fa[find(x)] = find(y);
}
int main()
{Pair p, q;int n, m, x, y;char c;cin >> n >> m;for(int i = 1; i <= m; ++i){cin >> x >> y >> c;p = Pair(x, y);if(c == 'D')q = Pair(x+1, y);else//c == 'R'q = Pair(x, y+1);if(fa.count(p) == 0)//如果不存在该点,则初始化 fa[p] = p;if(fa.count(q) == 0)fa[q] = q;if(find(p) == find(q))//p, q已连通,p,q再连边,则存在环 {cout << i;//输出步数 return 0;}merge(p, q);//合并两点 }cout << "draw";return 0;
}

相关文章:

信息学奥赛一本通 1347:【例4-8】格子游戏

【题目链接】 ybt 1347&#xff1a;【例4-8】格子游戏 【题目考点】 1. 并查集&#xff1a;判断无向图是否有环 【解题思路】 该题为判断无向图是否有环。可以使用并查集来完成。 学习并查集时&#xff0c;每个元素都由一个整数来表示。而该问题中每个元素是一个坐标点&a…...

acwing3417. 砝码称重

acwing3417. 砝码称重算法 1: DFS算法2 : DP算法 1: DFS /*** 数据范围 对于 50%的评测用例&#xff0c;1≤N≤15. 对于所有评测用例&#xff0c;1≤N≤100&#xff0c;N 个砝码总重不超过 1e5. */ /* 算法 1: DFS 思路 : 对于每个砝码,有放在左边,放在右边,和不放三种选择,使…...

生成式 AI:百度“文心一言”对标 ChatGPT?什么技术趋势促使 ChatGPT 火爆全网?

文章目录前言一、生成式 AI 的发展和现状1.1、什么是生成式 AI&#xff1f;1.2、生成式 AI 的发展趋势1.3、AI 生成内容的业务场景和分类二、生成式 AI 从分析领域到创作领域2.1、 降低内容创作门槛&#xff0c;增加 UGC 用户群体2.2、提升创作及反馈效率&#xff0c;铺垫线上实…...

PCL 非线性最小二乘法拟合圆柱

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里通过非线性最小二乘的方法来实现圆柱体的拟合,具体的计算过程如下所述: 图中, p p p为输入数据的点位置,求解的参数为柱体的轴向向量 a...

【设计模式】迪米特法则

文章目录一、迪米特法则定义二、迪米特法则分析三、迪米特法则实例一、迪米特法则定义 迪米特法则(Law of Demeter, LoD)&#xff1a;一个软件实体应当尽可能少地与其他实体发生相互作用。 二、迪米特法则分析 如果一个系统符合迪米特法则&#xff0c;那么当其中某一个模块发…...

CSS3笔试题精讲1

Q1 BFC专题 防止父元素高度坍塌 4种方案 父元素的高度都是由内部未浮动子元素的高度撑起的。 如果子元素浮动起来,就不占用普通文档流的位置。父元素高度就会失去支撑,也称为高度坍塌。 即使有部分元素留在普通文档流布局中支撑着父元素,如果浮动 起来的元素高度高于留下的…...

交叉编译用于移植的Qt库

前言 如果在Ubuntu上使用qt开发可移植到周立功开发板的应用程序,需要在Ubuntu上交叉编译用于移植的Qt库,具体做法如下: 1、下载源码 源码qt-everywhere-opensource-src-5.9.6.tar.xz拷贝到ubuntu自建的software文件下 2、解压 点击提取到此处 3、安装配置 运行脚本文…...

泰凌微TLSR8258 zigbee开发环境搭建

目录必备软件工具抓包分析辅助工具软件开发包PC 辅助控制软件 (ZGC)必备软件工具 下载地址&#xff1a;http://wiki.telink-semi.cn/ • 集成开发环境: TLSR8 Chips: Telink IDE for TC32 TLSR9 Chips: Telink RDS IDE for RISC-V • 下载调试工具: Telink Burning and Debugg…...

C#实现商品信息的显示异常处理

实验四&#xff1a;C#实现商品信息的显示异常处理 任务要求&#xff1a; 在进销存管理系统中&#xff0c;商品的库存信息有很多种类&#xff0c;比如商品型号、商品名称、商品库存量等。在面向对象编程中&#xff0c;这些商品的信息可以存储到属性中&#xff0c;然后当需要使…...

细数N个获取天气信息的免费 API ,附超多免费可用API 推荐(三)

前言 市面上有 N 多个查询天气信息的软件、小程序以及网页入口&#xff0c;基本都是通过调用天气查询 API 去实现的。 今天整理了一下多种场景的天气预报API 接口分享给大家&#xff0c;有需要赶紧收藏起来。 天气预报查询 天气预报查询支持全国以及全球多个城市的天气查询…...

20230404英语学习

今日单词 decade n.十年 allocate vt.分配&#xff0c;分派&#xff0c;把…拨给 compress v.压缩&#xff1b;缩短&#xff1b;浓缩 regenerate v.&#xff08;使&#xff09;复兴&#xff0c;&#xff08;使&#xff09;振兴&#xff1b;&#xff08;使&#xff09;再生 …...

冒泡排序 快排(hoare递归)

今天要讲一个是冒泡排序&#xff0c;进一个是快排&#xff0c;首先是冒泡排序&#xff0c;我相信大家接触的第一个排序并且比较有用的算法就是冒泡排序了&#xff0c;冒泡排序是算法里面比较简单的一种&#xff0c;所以我们先看看一下冒泡排序 还是个前面一样&#xff0c;我们…...

49天精通Java,第24天,Java链表、散列表、HashSet、TreeSet

目录一、链表二、散列表三、HashSet四、TreeSet五、TreeSet常用方法大家好&#xff0c;我是哪吒。 一、链表 从数组中间删除一个元素开销很大&#xff0c;其原因是向数组中插入元素时&#xff0c;此元素之后的所有元素都要向后端移动&#xff0c;删除时也是&#xff0c;数组中…...

HashMap源码分析小结

HashMap相关问题 HashMap实现原理 HashMap是以键值对的形式存储数据&#xff0c;内部是通过数组链表结构实现&#xff0c;在1.7之后的版本&#xff0c;链表结构可以升级为红黑树&#xff0c;提高查询效率 key和value都支持为null&#xff1b;key为null时hash值是0&#xff0…...

太奇怪了!小公司面试全挂,大厂面试全过,为什么小公司要求比大厂还高?...

大厂的人才去小公司面试&#xff0c;一定是降维打击吗&#xff1f;还真未必。一位网友很困惑&#xff1a;真的奇怪&#xff0c;小公司面试全挂&#xff0c;大厂面试10个过了9个&#xff0c;感觉小公司要求比大厂还高&#xff0c;这是怎么了&#xff1f;来看看网友们的看法。有人…...

Java开发环境配置

Java开发环境配置 Java是目前世界上最流行的编程语言之一&#xff0c;它的使用范围广泛&#xff0c;从Web应用程序到桌面应用程序再到移动应用程序&#xff0c;Java都是一种非常有用的语言。想要进行Java开发&#xff0c;首先需要在计算机上配置Java开发环境。 在本文中&…...

大学英语视听说教程(陈向京版本)

词汇题&#xff08;55道&#xff09; 1. You should carefully think over_____ the manager said at the meeting. A. that B. which C. what D. whose 1.选C,考察宾语从句连接词&#xff0c;主句谓语动词think over后面缺宾语&#xff0c;后面的宾语从句谓语动…...

nginx--开源免费

nginx开源免费&#xff0c;支持高性能&#xff0c;高并发的web服务和代理服务软件。 apache,nodejs nginx可以提供的服务&#xff1a; 1、web服务 2、负载均衡&#xff08;反向代理&#xff09;&#xff08;动静分离&#xff09; 3、web cache(web缓存&#xff09; nginx…...

阿里云OSS对象存储

目录 1&#xff1a;OSS 1.1&#xff1a;开通OSS服务 1.2&#xff1a;搭建OSS环境 1.2.1&#xff1a;创建Bucket存储空间 1.2.2&#xff1a;创建文件夹上传图片 1.2.3&#xff1a;RAM访问控制 1.3&#xff1a;快速入门 1.3.1&#xff1a;下载SDK 1.3.2&#xff1a;搭建环…...

基于VHDL语言的汽车测速系统设计_kaic

摘 要 汽车是现代交通工具。车速是一项至关重要的指标。既影响着汽车运输的生产率,又关乎着汽车行驶有没有超速违章&#xff0c;还影响着汽车行驶时人们的人身安全。而伴随着我国国民的安全防范意识的逐步增强&#xff0c;人们也开始越来越关心因为汽车的超速而带来的极其严重…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...