多重 for
文の全探索に慣れよう!
問題概要
長さ の文字列 が与えられる。次の条件を満たす 3 つ組の整数 が存在するかどうかを判定せよ。
- の 文字目は 'I' である
- の 文字目は 'O' である
- の 文字目は 'I' である
制約
解法
を満たすような は次のような 3 重の for
文で走査できます。
for (int i = 1; i <= N; ++i) { for (int j = i + 1; j <= N; ++j) { for (int k = j + 1; k <= N; ++k) { } } }
ここで、変数 j
の初期値を 1
ではなく i + 1
にしていることに注意しましょう。同様に、変数 k
の初期値も 1
ではなく j + 1
にしています。これによって、
という関係性が表現できます。
あとは、 の 文字目がそれぞれ I, O, I であることを判定しましょう。
コード
ここでは、0-indexed で実装しました。つまり、 を 0 以上 未満の範囲で探索することとしました。
#include <bits/stdc++.h> using namespace std; int main() { int N; string S; cin >> N >> S; bool res = false; for (int i = 0; i < N; ++i) { for (int j = i + 1; j < N; ++j) { for (int k = j + 1; k < N; ++k) { if (S[i] == 'I' && S[j] == 'O' && S[k] == 'I') { res = true; } } } } if (res) cout << "Yes" << endl; else cout << "No" << endl; }