hiro1729 競プロ

競プロの解説などを書きます。

ABC327-C 解説

C - Number Place

ナンプレが正しいかどうかの判定です。

縦、横、ブロックごとにsetに突っ込んで全ての長さが $9$ であるかを判定すればいいです。

Python

s = [list(map(int, input().split())) for _ in range(9)]
a = [set() for _ in range(9)]
b = [set() for _ in range(9)]
c = [set() for _ in range(9)]
for i in range(9):
  for j in range(9):
    a[i].add(s[i][j])
    b[j].add(s[i][j])
    c[(i // 3) * 3 + (j // 3)].add(s[i][j])
ok = True
for i in a:
  if len(i) < 9:
    ok = False
for i in b:
  if len(i) < 9:
    ok = False
for i in c:
  if len(i) < 9:
    ok = False
print("Yes" if ok else "No")

C++

#include <iostream>
#include <vector>
#include <set>
using namespace std;

int main() {
  vector<vector<int>> s(9, vector<int>(9));
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      cin >> s[i][j];
    }
  }
  vector<set<int>> a(9), b(9), c(9);
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      a[i].insert(s[i][j]);
      b[j].insert(s[i][j]);
      c[(i / 3) * 3 + (j / 3)].insert(s[i][j]);
    }
  }
  bool ok = true;
  for (set<int> &i: a) {
    if (i.size() < 9) {
      ok = false;
    }
  }
  for (set<int> &i: b) {
    if (i.size() < 9) {
      ok = false;
    }
  }
  for (set<int> &i: c) {
    if (i.size() < 9) {
      ok = false;
    }
  }
  cout << (ok ? "Yes" : "No");
}