L2-040 哲哲打游戏 (25 分)(分析题目意思,读懂题)

2023-11-17

哲哲是一位硬核游戏玩家。最近一款名叫《达诺达诺》的新游戏刚刚上市,哲哲自然要快速攻略游戏,守护硬核游戏玩家的一切!

为简化模型,我们不妨假设游戏有 N 个剧情点,通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点。此外,游戏还设置了一些存档,在某个剧情点可以将玩家的游戏进度保存在一个档位上,读取存档后可以回到剧情点,重新进行操作或者选择,到达不同的剧情点。

为了追踪硬核游戏玩家哲哲的攻略进度,你打算写一个程序来完成这个工作。假设你已经知道了游戏的全部剧情点和流程,以及哲哲的游戏操作,请你输出哲哲的游戏进度。

输入格式:
输入第一行是两个正整数 N 和 M (1≤N,M≤10
5
),表示总共有 N 个剧情点,哲哲有 M 个游戏操作。

接下来的 N 行,每行对应一个剧情点的发展设定。第 i 行的第一个数字是 K
i

,表示剧情点 i 通过一些操作或选择能去往下面 K
i

个剧情点;接下来有 K
i

个数字,第 k 个数字表示做第 k 个操作或选择可以去往的剧情点编号。

最后有 M 行,每行第一个数字是 0、1 或 2,分别表示:

0 表示哲哲做出了某个操作或选择,后面紧接着一个数字 j,表示哲哲在当前剧情点做出了第 j 个选择。我们保证哲哲的选择永远是合法的。
1 表示哲哲进行了一次存档,后面紧接着是一个数字 j,表示存档放在了第 j 个档位上。
2 表示哲哲进行了一次读取存档的操作,后面紧接着是一个数字 j,表示读取了放在第 j 个位置的存档。
约定:所有操作或选择以及剧情点编号都从 1 号开始。存档的档位不超过 100 个,编号也从 1 开始。游戏默认从 1 号剧情点开始。总的选项数(即 ∑K
i

)不超过 10
6

输出格式:
对于每个 1(即存档)操作,在一行中输出存档的剧情点编号。

最后一行输出哲哲最后到达的剧情点编号。

输入样例:
10 11
3 2 3 4
1 6
3 4 7 5
1 3
1 9
2 3 5
3 1 8 5
1 9
2 8 10
0
1 1
0 3
0 1
1 2
0 2
0 2
2 2
0 3
0 1
1 1
0 2
结尾无空行
输出样例:
1
3
9
10
结尾无空行
样例解释:
简单给出样例中经过的剧情点顺序:

1 -> 4 -> 3 -> 7 -> 8 -> 3 -> 5 -> 9 -> 10。

档位 1 开始存的是 1 号剧情点;档位 2 存的是 3 号剧情点;档位 1 后来又存了 9 号剧情点。

如果你是因为没有看懂题来搜的题解,希望这篇博客能够帮助你,花了一个简图
1 号剧情点,通过 1 号操作到达剧情点 2,通过 2 号操作到达剧情点 3,题中 (0, 3)的意思就是,目前在 1 号剧情点,通过 操作 3,进入剧情点 4。
在这里插入图片描述

这里要读懂题目
在这里插入图片描述
我一开始想的是邻接表存储,xuan[x][i] 指的就是在 x 点通过 i 操作到达的位置,这样,设置一个变量 now, 表示当前所在的位置,定义一个存档 dang 数组,存放第 i 个档位的剧情点编号

第一版,临界表(不是满分,内存过大),不过可以参考思路,先看题解:

#include<iostream>
#include<string>
#include<algorithm>
#include<bits/stdc++.h>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<deque>
#include<cctype>
#include<unordered_set>
#include<unordered_map>
#include<fstream>
#include<cstring>
using namespace std;
const int MAXN = 22222;
int dang[101];
int xuan[MAXN][MAXN];
int N, M;
int now = 1;
int main() {
    cin >> N >> M;
    for (int i = 1; i <= N; i++) {
    	int k;
    	cin >> k;
    	for (int j = 1; j <= k; j++) {
    		int x;
    		cin >> x;
    		// 输入 x 表示可以到达的剧情点,xuan[i][j] 表示 i 号剧情点通过 j 号操作到达的位置 x
    		xuan[i][j] = x;
		}
	}
	for (int i = 1; i <= M; i++) {
		int x, j;
		cin >> x >> j;
		if (x == 0) {
		//	如果 x 等于 0,更新现在位置,就是现在的位置走了 j 号操作
			now = xuan[now][j];
		} else if (x == 1) {
		// 存档,j 号档位存储 now 位置
			dang[j] = now;
			cout << now << endl;
		} else if (x == 2) {
		//	读到 now 跳到 档
			now = dang[j];
		}
	}
	cout << now; 
    return 0;
}



第一种临界矩阵的方法只能拿18 分,原因很简单,二维数组内存太大了,定义不了,那如果二维数组不行,使用临界表行吗?

第二版,使用邻接表,满分

看了代码会发现,为什么与 总左边没关系了呢,为什么刚开始要进行初始化?
这一步的目的是什么呢?

for (int i = 1; i<= N; i++) {
    	xuan[i].push_back(0);
	}

我们知道,二维数组都是 从 0 开始的,但是题目中,所有的都是从 1 开始,如果我们将每一个二维数组的初始都加上 0,那么下标就等于操作号 j 了,举个例子

xuan[i].push_back(x) // 意思是 剧情点 i,能够到达 x 剧情,如果已经初始化,那么 x 就是 x[i][j] j 从 1 开始,也就是说,我们不需要管 j 操作,因为在临界表的顺序就是正确的,见图:

在这里插入图片描述
可见,初始就是让纵坐标与 j 操作相同

#include<iostream>
#include<string>
#include<algorithm>
#include<bits/stdc++.h>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<deque>
#include<cctype>
#include<unordered_set>
#include<unordered_map>
#include<fstream>
#include<cstring>
using namespace std;
const int MAXN = 100001;
int dang[MAXN];
vector<int>xuan[MAXN];
int N, M;
int now = 1;
int main() {
    cin >> N >> M;
    for (int i = 1; i<= N; i++) {
    	xuan[i].push_back(0);
	}
    for (int i = 1; i <= N; i++) {
    	int k;
    	cin >> k;
    	for (int j = 1; j <= k; j++) {
    		int x;
    		cin >> x;
    		xuan[i].push_back(x);
		}
	}
	for (int i = 1; i <= M; i++) {
		int x, j;
		cin >> x >> j;
		if (x == 0) {
			now = xuan[now][j];
		} else if (x == 1) {
			dang[j] = now;
			cout << now << endl;
		} else if (x == 2) {
			now = dang[j];
		}
	}
	cout << now; 
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

L2-040 哲哲打游戏 (25 分)(分析题目意思,读懂题) 的相关文章

随机推荐

  • java student类_java定义一个Student类,包含内容如下

    展开全部 public class Student 成员变量 学号 姓名 性别 班干部否 数学 语文 外语 成62616964757a686964616fe58685e5aeb931333337613166员方法 输入 总分 平均分 编程实
  • MeterSphere实践指南汇总,搬砖党

    闲来无事 整理了MeterSphere实践指南 我司用了MeterSphere一段时间 感觉挺好用 百度网盘下载链接 链接 https pan baidu com s 1s8sAuz31lgnvTRTLkWZuiQ pwd 98bg 提取码
  • 我的算法笔记(1)——冒泡排序

    我的算法笔记 1 冒泡排序 排序是指将一个无序序列按某个规则进行有序排列 而冒泡排序是排序算法中最基础的一种 现给出一个序列a 其中元素的个数为n 要求将他们按从小到大的顺序排序 冒泡排序的本质在于交换 即每次通过交换的方式把当前剩余元素的
  • BP神经网络阈值

    在基于神经网络的数据融合文章里 有改进权值和阈值 但是没有说清阈值到底是什么 神经网络是模仿大脑的神经元 当外界刺激达到一定的阈值时 神经元才会受到刺激 影响下一个神经元 简单来说 超过阈值 就会引起某一变化 不超过阈值 无论是多少 都不产
  • 【数据库实验】sql总结

    首先说明 以下大部分针对的是标准sql 目录 结构 关键词 关于模式 创建模式 删除模式 关于表 创建表 修改表 删除表 关于索引 建立索引 修改索引 删除索引 关于查询 几个点 指定列 全部列 经过计算的值 列的别名 方便查看 以及聚集函
  • 深度学习:将新闻报道按照不同话题性质进行分类

    深度学习的广泛运用之一就是对文本按照其内容进行分类 例如对新闻报道根据其性质进行划分是常见的应用领域 在本节 我们要把路透社自1986年以来的新闻数据按照46个不同话题进行划分 网络经过训练后 它能够分析一篇新闻稿 然后按照其报道内容 将其
  • Unity学习记录——模型与动画

    Unity学习记录 模型与动画 前言 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业7 编程题 智能巡逻兵 1 学习参考 除去老师在课堂上讲的内容 本次作业代码与操作主要参考了 傅老師 Unity教學 DarkSouls複刻經
  • 使用QT绘制极坐标图表

    使用QT绘制极坐标图表 在数据可视化领域 极坐标图表是非常常见的一种图表类型 QT作为一个高效 易用的GUI框架 也提供了绘制极坐标图表的功能 下面我们就来看一下如何使用QT绘制极坐标图表 首先 我们需要创建一个QT项目 选择 QT Wid
  • 数据结构与算法——第一章绪论

    数据结构与算法 绪论 数据结构的研究对象 数据结构的表示 DS的第一个重要部分 逻辑结构 DS第二个重要部分 数据的存储结构 计算机如何存储 结点及结点关系 数据结构的发展概况 抽象数据型 抽象数据型的定义 数据类型 数据结构和抽象数据型
  • 牛客网--专项训练--软件测试(待补充)

    1 集成测试分为渐增组装测试和 非渐增组装测试 渐增组装测试 是测完一个再加上一个一起测试 非渐增组装测试 是一个一个的测试 2 海伦公式求三角形面积 等价类测试用例中无效等价类意思就是无法构成三角形的 3 白盒测试是对代码内部的逻辑测试
  • Python异步请求:异步编程的常见问题

    Python异步请求 异步编程的常见问题 异步编程的常见问题 在异步编程过程中 可能会遇到一些常见的问题 了解这些问题并掌握解决方法对于开发高效的异步应用程序至关重要 异常处理 在异步编程中 异常处理变得更加关键 在同步编程中 异常通常可以
  • IDEA中设置注释模板的方法

    IDEA中设置注释模板主要分为两个部分 分别是创建java文件时类的注释和方法的注释 这里为大家详细介绍一下方法 按MyEclipse的风格设置 MyEclipse的请看 MyEclipse中设置注释模板的方法 大家可以根据自己的习惯生成自
  • [Monana] Windows/Linux/mac下Anaconda3 Python3配置Tensorflow最简明教程~(只用一步)

    Authored by MonanaHe Contact me via hemonan vip 163 com 0 写在前面的话 为什么我敢说这是最简明的教程 网上很多人用conda安装tf 而且是单独装一个tensorflow的环境 这样
  • 2023华为OD机试真题(java 100%通过)【最多获得的短信条数/动态规划】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • 最全Android 开发和安全系列工具

    阿里聚安全出品 史上最全Android 开发和安全系列工具 作者 菜刀文 关注 2017 02 20 00 08 字数 4554 阅读 725 评论 1 喜欢 29 作者 阿里聚安全 地址 https zhuanlan zhihu com
  • flex布局最后一行列表左对齐的方法

    使用flex布局两端对齐 但是最后一行元素居中会很丑 所以可以让最后一行元素左对齐 方法如下 改之前 html div class list box div class item div gt div css list box displa
  • SIP 抓包后获取媒体内容备忘(解析RTP)

    SIP呼叫并抓包 从网上找免费的sip 软中端 两个转中端建立呼叫且抓包 详情可以参考 https blog csdn net liuxingrui4p article details 96709136 spm 1001 2014 3001
  • C++ 编译报错“jump to label”

    C 编译报错 jump to label 分析 解决方法 如何在Eclipse中添加编译选项 分析 void func int a 0 a goto label label int b 0 return 这样的代码是有问题的 因为C 编译规
  • Python计算机视觉编程(八)图像检索

    图像检索 BOW模型 基于BOW的图像检索 特征提取 视觉词典 TF IDF 常用参数 图像检索 具体实现流程 BOW模型 Bag of words models模型 词袋模型 词袋模型对于给定的两个文档 进行分割可以建构出一个有n个元素词
  • L2-040 哲哲打游戏 (25 分)(分析题目意思,读懂题)

    哲哲是一位硬核游戏玩家 最近一款名叫 达诺达诺 的新游戏刚刚上市 哲哲自然要快速攻略游戏 守护硬核游戏玩家的一切 为简化模型 我们不妨假设游戏有 N 个剧情点 通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点 此外 游戏还设置了