哲哲是一位硬核游戲玩家,最近一款名叫《達諾達諾》的新游戲剛剛上市,哲哲自然要快速攻略游戲,守護硬核游戲玩家的一切!
為簡化模型,我們不妨假設游戲有 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 號劇情點.
第一版:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
//感覺好像就憑陣列就可以解出,只要思路清晰就沒問題
int n1,n2,m1,t1,tmp,sign1,sign2;
cin>>n1>>n2;
int pp[n1][10]={0},stor[n1][3]={0};
for(int i=1;i<=n1;i++)
{ cin>>m1;
for(int j=1;j<=m1;j++)
cin>>pp[i][j]; }
t1=1;
while(n2--)
{
cin>>sign1>>sign2;
if(sign1==0)
t1=pp[t1][sign2];
else if(sign1==1)
{stor[sign2-1][0]=t1;
printf("%d\n",t1);}
else if(sign1==2)
{
t1=stor[sign2-1][0];
}
}
printf("%d\n",t1);
return 0;
}
但是還有幾個沒過,不過沒想到居然L2的題用陣列就可以解開三個樣例

第二版考慮改用變長陣列,STL容器,vector

哇,全過了,真棒,看來以后真的不能被嚇到,慢慢來,耐心點,后面的題目選著寫是可以做到的,
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
//感覺好像就憑陣列就可以解出,只要思路清晰就沒問題
int n1,n2,m1,t1,tmp,sign1,sign2;
cin>>n1>>n2;
vector<int> pp[n1+1];
int stor[n1]={0};
for(int i=1;i<=n1;i++)
{ cin>>m1;
for(int j=1;j<=m1;j++)
{ cin>>tmp;
pp[i].push_back(tmp);
} }
t1=1;
while(n2--)
{
cin>>sign1>>sign2;
if(sign1==0)
t1=pp[t1][sign2-1];
else if(sign1==1)
{stor[sign2-1]=t1;
printf("%d\n",t1);}
else if(sign1==2)
{
t1=stor[sign2-1];
}
}
printf("%d\n",t1);
return 0;
}
帶有注釋的全過版本:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
//感覺好像就憑陣列就可以解出,只要思路清晰就沒問題
int n1,n2,m1,t1,tmp,sign1,sign2;
cin>>n1>>n2;
vector<int> pp[n1+1];//用來儲存設定的關卡跳轉
int stor[n1]={0};//用來儲存,存檔的關卡
for(int i=1;i<=n1;i++)
{ cin>>m1;
for(int j=1;j<=m1;j++)
{ cin>>tmp;
pp[i].push_back(tmp);//變長陣列有利于減少空間,也防止段錯誤
} }
t1=1;
while(n2--)
{
cin>>sign1>>sign2;
if(sign1==0)
t1=pp[t1][sign2-1];//操作的時候,知道到哪個關卡了
else if(sign1==1)
{stor[sign2-1]=t1;
printf("%d\n",t1);}//存檔,存下當前關卡
else if(sign1==2)
{
t1=stor[sign2-1];//讀第幾檔
}
}
printf("%d\n",t1);
return 0;
}
//看似好像要考慮陣列的橫坐標和縱坐標 ,實際上一直只是橫坐標,縱坐標 只是橫坐標的一個跳轉
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287691.html
標籤:其他
下一篇:獲取幸運數
