题目:
图片来源于拼题a官网
分析:
这道题乍一看题面长比较吓人,实际上就是一个简单的模拟判断题
变量声明:
n,m 和题目相同
spot 保存角色当前所在的剧情点
pos[ i ] 存放第 i 个档位所保存的剧情点
v[ i ][ j ] 存放剧情点 i 的第 j 个发展点
op 游戏操作0,1,2
首先解决剧情发展点的问题
n 个剧情点,每个剧情点又对应有 num 个的发展点,建立一个二维数组 a[n][num] 来存放相应数据,但是 1e5*1e5 的数组是无法存在的,可以考虑用 vector 的伪散列表代替,虽然跑起来会慢一点
接下来是游戏操作
简单梳理一下就懂了,分类讨论:
op = 0:也就是在当前剧情点选择第 x 个发展点,直接根据散列表更新剧情点即可
op = 1:将当前剧情点存入第 x 个档位
op = 2:跳转到第 x 个档位存放的剧情点
代码:
我不太喜欢用 0 下标,主要是防止自己没反应过来造成下标错位,所以这里的 vector[ i ] 先填入了一个没用的 0
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define N 100010
int n, m, num, x, op;
int spot = 1, pos[N];
vector<int>v[N];
int main(void)
{
scanf("%d%d", &n, &m);
//N个剧情点
for(int i = 1; i <= n; i++){
scanf("%d", &num);
v[i].push_back(0); //去掉0下标
for(int j = 1; j <= num; j++){
scanf("%d", &x);
v[i].push_back(x);
}
}
//M次操作
for(int i = 1; i <= m; i++){
scanf("%d%d", &op, &x);
if(op == 0)
//跳到对应的剧情点
spot = v[spot][x];
else if(op == 1){
cout <<spot <<endl;
//将当前剧情点存入第x档位
pos[x] = spot;
}
else
//读取第x档位的剧情点并更新
spot = pos[x];
}
//输出最后的剧情点
cout <<spot <<endl;
return 0;
}