哲哲是一位硬核游戏玩家。最近一款名叫《达诺达诺》的新游戏刚刚上市,哲哲自然要快速攻略游戏,守护硬核游戏玩家的一切! 为简化模型,我们不妨假设游戏有 N 个剧情点,通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点。此外,游戏还设置了一些存档,在某个剧情点可以将玩家的游戏进度保存在一个档位上,读取存档后可以回到剧情点,重新进行操作或者选择,到达不同的剧情点。 为了追踪硬核游戏玩家哲哲的攻略进度,你打算写一个程序来完成这个工作。假设你已经知道了游戏的全部剧情点和流程,以及哲哲的游戏操作,请你输出哲哲的游戏进度。 输入格式:输入第一行是两个正整数 N 和 M (1≤N,M≤105),表示总共有 N 个剧情点,哲哲有 M 个游戏操作。 接下来的 N 行,每行对应一个剧情点的发展设定。第 i 行的第一个数字是 Ki,表示剧情点 i 通过一些操作或选择能去往下面 Ki 个剧情点;接下来有 Ki 个数字,第 k 个数字表示做第 k 个操作或选择可以去往的剧情点编号。 最后有 M 行,每行第一个数字是 0、1 或 2,分别表示:
约定:所有操作或选择以及剧情点编号都从 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 号剧情点。
思路 :
vector<int> road[a] 存入节点 'a' 联通的下一节点
save[101] 为每个存档位置
然后...就没有然后了!
C/C++ (2A)
#include<bits/stdc++.h>
using namespace std;
vector<int> road[1000001]; // 通向的下一个游戏节点记录
int main()
{
int N,M,n,num,now=1,save[101]={0}; // now : 当前位置,save存档
// 数据读入
cin >> N >> M;
for(int z=1;z<=N;z++){
cin >> n;
while (n--)
{
cin >> num;
road[z].push_back(num);
}
}
// 操作
while (M--){
cin >> n >> num;
if(n==0) now = road[now][num-1];
else if(n==2) now = save[num];
else
{
save[num] = now;
cout << now << endl;
}
}
cout << now << endl;
return 0;
}
C/C++ (1A)
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<vector<long>> Sum; // 储存各个剧情点
vector<long> spot; // 储存各剧情点的具体内容
vector<long> save; // 所有存档的保存记录储存
Sum.push_back(spot); // 编号从1开始所有先+1
long N,M,num,a,op[101]; // op保存该位置最新的存档
scanf("%ld %ld",&N,&M);
for(long z=0;z<N;z++){
scanf("%ld",&num);
spot.push_back(0); // 编号从1开始所有先+1(其实判断的时候-1也可以)
while (num--){
scanf("%ld",&a);
spot.push_back(a);
}
Sum.push_back(spot); // 该剧情点存入
spot.clear();
}
long now_Site=1,command; // 当前所在剧情点 , 操作命令
while (M--){
scanf("%ld %ld",&command,&a);
if(command==1){
save.push_back(now_Site);
op[a] = now_Site;
}
if(command==0) now_Site=Sum[now_Site][a];
if(command==2) now_Site = op[a];
}
// 答案输出
while (!save.empty()){
cout << save.front() << endl;
save.erase(save.begin());
}
cout << now_Site;
return 0;
}