すごろくを題材にした問題。すごろくの各マスには「oo マス進む」などの指示がある。これを上手に管理しよう。
問題概要
マス からなる双六が与えられる。マス 1 がスタート、マス
以上がゴールである。
回サイコロを振って、
回目には目
だけ出て、その分だけ進む。
双六のマス には「
マス進む」(
のこともある) という指示が書いてあり、サイコロを振ってそのマスに到達したら、その指示に従う。
ゴールまでにサイコロを振る回数を求めよ。
制約
解法
現在いるマス pl を更新しながらシミュレーションしていけばよい。 回目のサイコロ振りは次のように実装できる。
回目のサイコロの目が
dice[i]であるとき、pl += dice[i]と更新する- もし
pl >= Nならば、反復を終了する - 双六の目
plの指示がmove[pl]であるとき、pl += move[pl]と更新する - もし
pl >= Nならば、反復を終了する
あとは、この反復を実装すればよい。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N, M, pl = 1; cin >> N >> M; vector<int> move(N+1), dice(M); for (int i = 1; i <= N; i++) cin >> move[i]; for (int i = 0; i < M; i++) cin >> dice[i]; for (int iter = 0; iter < M; iter++) { pl += dice[iter]; if (pl >= N) { cout << iter+1 << endl; return 0; } pl += move[pl]; if (pl >= N) { cout << iter+1 << endl; return 0; } } }