当前位置: 首页 > 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;人们也开始越来越关心因为汽车的超速而带来的极其严重…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...