一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
题目详情:
哲哲是一位硬核游戏玩家。最近一款名叫《达诺达诺》的新游戏刚刚上市,哲哲自然要快速攻略游戏,守护硬核游戏玩家的一切!
为简化模型,我们不妨假设游戏有 N 个剧情点,通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点。此外,游戏还设置了一些存档,在某个剧情点可以将玩家的游戏进度保存在一个档位上,读取存档后可以回到剧情点,重新进行操作或者选择,到达不同的剧情点。
为了追踪硬核游戏玩家哲哲的攻略进度,你打算写一个程序来完成这个工作。假设你已经知道了游戏的全部剧情点和流程,以及哲哲的游戏操作,请你输出哲哲的游戏进度。
1.- 0 表示哲哲做出了某个操作或选择,后面紧接着一个数字 j,表示哲哲在当前剧情点做出了第 j 个选择。我们保证哲哲的选择永远是合法的。
2.- 1 表示哲哲进行了一次存档,后面紧接着是一个数字 j,表示存档放在了第 j 个档位上。
3.- 2 表示哲哲进行了一次读取存档的操作,后面紧接着是一个数字 j,表示读取了放在第 j 个位置的存档。
约定:所有操作或选择以及剧情点编号都从 1 号开始。存档的档位不超过 100 个,编号也从 1 开始。游戏默认从 1 号剧情点开始。总的选项数(即 ∑Ki)不超过 106。
输出格式:
对于每个 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 号剧情点。
分析
题意
模拟。首先模拟剧情。
接下来的 N 行,每行对应一个剧情点的发展设定。第 i 行的第一个数字是 Ki,表示剧情点 i 通过一些操作或选择能去往下面 Ki 个剧情点;接下来有 Ki 个数字,第 k 个数字表示做第 k 个操作或选择可以去往的剧情点编号。
用代码模拟按下不同的键分别进行选择,存档,读档的操作。
- 0 表示哲哲做出了某个操作或选择,后面紧接着一个数字 j,表示哲哲在当前剧情点做出了第 j 个选择。我们保证哲哲的选择永远是合法的。
- 1 表示哲哲进行了一次存档,后面紧接着是一个数字 j,表示存档放在了第 j 个档位上。
- 2 表示哲哲进行了一次读取存档的操作,后面紧接着是一个数字 j,表示读取了放在第 j 个位置的存档。
根据上面的条件写代码就行。
思路
- 首先创建剧情。开一个存储剧情的二维数组,剧情点用二维数组的第一维下标表示,第二位储存相应的操作。这样就可以根据下标就能快速找到剧情点,并且进行选择的操作。
- 其次代码模拟选择,存档,读档。选择直接根据剧情数组进行选择,存档可以另外开一个存档数组,将对应存档点与存档数组下标对应,读取直接根据下标读取即可。
代码如下:
#include<vector>
using namespace std;
const int maxn=100000;
int cun[maxn];
vector<int> v[maxn];
int dangqian=1;
int caozuo(int w){
dangqian=v[dangqian-1][w-1];
//这里要注意是dangqian-1,因为剧情点是从1开始,这个代码将剧情点从0的位置开始存储所以要-1。
//如果从1开始的话就不需要-1。
return 0;
}
int cundang(int y){
cun[y]=dangqian;
return 0;
}
int dudang(int y){
dangqian=cun[y];
}
int main(){
int N,M;
cin>>N>>M;
for(int i=0;i<N;i++){
long X;
cin>>X;
for(long j=0;j<X;j++)
{
int m;
cin>>m;
v[i].push_back(m);
}
}
while(M--){
int x,y;
cin>>x>>y;
switch(x){
case 0:
caozuo(y);
break;
case 1:
cout<<dangqian<<'\n';
cundang(y);
break;
case 2:
dudang(y);
break;
}
}
cout<<dangqian;
}