Official
B - 宝物の地図 / Treasure Map Editorial by admin
gpt-6-astra-medium概要
各行に宝物を表す T が含まれているかを調べます。含まれていれば o、含まれていなければ x を、上の行から順に並べて出力します。
考察
ある行の答えを決めるには、その行だけを調べれば十分です。他の行に宝物があるかどうかは関係ありません。
そこで、各行の文字をすべて確認し、T の個数を数えます。
Tが \(0\) 個なら、宝物がないのでxTが \(1\) 個以上なら、宝物があるのでo
例えば、行が ..T.T なら T は \(2\) 個あるため o、..... なら \(0\) 個なので x です。
この問題では、すべてのマスを調べる素朴な方法で十分です。マス数は最大でも \(10 \times 10 = 100\) 個なので、時間制限を超える心配はありません。なお、宝物が「ちょうど \(1\) 個」の場合だけ o にすると、複数ある行で誤答になるため注意しましょう。
アルゴリズム
- \(H\) と \(W\) を読み込み、答えを格納する空の文字列
ansを用意します。 - 上の行から順に、次の処理を行います。
- その行の文字列
sを読み込みます。 - 宝物の個数を表す
cntを \(0\) にします。 sの \(W\) 文字を調べ、Tが見つかるたびにcntを \(1\) 増やします。cntが \(0\) ならansにx、そうでなければoを追加します。
- その行の文字列
ansを出力します。
各行のすべての文字を確認するため、cnt はその行にある宝物の個数と一致します。また、上から順に判定結果を追加するので、求める長さ \(H\) の文字列が得られます。
計算量
- 時間計算量: \(O(HW)\)
\(H\) 行それぞれについて、\(W\) 文字を調べます。 - 空間計算量: \(O(H + W)\)
長さ \(H\) の答えansと、長さ \(W\) の処理中の行sを保持します。
実装のポイント
cntは行ごとに \(0\) に戻します。前の行の個数を引き継がないようにしましょう。文字列の添字は \(0\) から始まるため、
s[0]からs[W-1]までを調べます。出力するのは小文字の
oとxです。数字の0や大文字のOと間違えないようにしましょう。地図全体を保存する必要はなく、\(1\) 行ずつ読み込んで処理できます。
ソースコード
// 問題文から独立に実装: 各行の T の個数を数え、0 なら x
#include <iostream>
#include <string>
int main() {
int h, w; std::cin >> h >> w;
std::string ans;
for (int i = 0; i < h; ++i) {
std::string s; std::cin >> s;
int cnt = 0;
for (int j = 0; j < w; ++j) if (s[j] == 'T') cnt++;
ans += (cnt == 0) ? 'x' : 'o';
}
std::cout << ans << std::endl;
}
この解説は gpt-6-astra-medium によって生成されました。