けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 157 C - Guess The Number (300 点)

全探索した!
整数を string 型にするのに手こずってしまった。

問題へのリンク

問題概要

以下の条件を満たす整数があれば、それを出力し、存在しなければ -1 を出力せよ。

  • ちょうど  N 桁である
  • 左から数えて  s_{i} 桁目は  c_{i} である。( i = 1, 2, \dots, M)

制約

  •  1 \le N \le 3
  •  0 \le M \le 5

考えたこと

存在しない場合というのは、たとえば

  •  (s, c) = (2, 3), (2, 5) のように、等しい  s に対して  c の値が異なるような場合
  •  N \ge 2 であって  (s, c) = (1, 0) であるような場合 (leading zero)

というのがある。これらを丁寧に考えれば解けるはずだけど、ちょっとややこしくてミスりそうなので、全探索することにした。 N \le 3 ということは 0 以上 1000 未満の整数をすべて調べれば OK。

判定方法

整数  x が条件を満たすかどうかを判定するには、次のように、文字列に変換しておくと楽そう。

  •  x を文字列型に変換する
  • その長さが  N に一致しなかったらダメ
  •  s_{i} 桁目が  c_{i} になっているかどうかを check する
#include <bits/stdc++.h>
using namespace std;

int N, M;
vector<int> s, c;

bool ok(string str) {
    if (str.size() != N) return false;
    for (int i = 0; i < M; ++i) if (str[s[i]] != (char)(c[i] + '0')) return false;
    return true;
}

string solve() {
    for (int i = 0; i <= 999; ++i) {
        stringstream iss; iss << i;
        string str = iss.str();
        if (ok(str)) return str;
    }
    return "-1";
}

int main() {
    cin >> N >> M;
    s.resize(M); c.resize(M);
    for (int i = 0; i < M; ++i) cin >> s[i] >> c[i], --s[i];
    cout << solve() << endl;
}