AtCoder が提供しているABC(AtCoder Beginner Contest)327 のC問題をC++とPythonで解いてみました。ABC327は、2023年11月4日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
C問題 Number Place(Difficulty : 169)
問題はリンク先をご覧ください。
ナンバープレースの正しい最終盤面か判定します。AtCoder Problems による Difficulty は、169 でした。
解答案
ナンバープレースまたは数独と呼ばれるペンシルパズルの正しい最終盤面か判定します。なお、数独は株式会社ニコリの登録商標です。
具体的には、9行、9列、9個のボックス(3行×3列)すべてに 1 から 9 までが入っているか確認します。
C++ プログラム例(ABC327C)
調べる範囲の数字を set コンテナに登録して、コンテナの大きさが 9 か確認します(19、28、40行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<vector<int>> a(9, vector<int>(9));
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
cin >> a[i][j];
}
}
bool result = true;
for (int i = 0; i < 9; ++i) {
set<int> row;
for (int j = 0; j < 9; ++j) {
row.insert(a[i][j]);
}
if (row.size() != 9) {
result = false;
}
}
for (int j = 0; j < 9; ++j) {
set<int> col;
for (int i = 0; i < 9; ++i) {
col.insert(a[i][j]);
}
if (col.size() != 9) {
result = false;
}
}
for (int i = 0; i < 9; i += 3) {
for (int j = 0; j < 9; j += 3) {
set<int> box;
for (int ti = 0; ti < 3; ++ti) {
for (int tj = 0; tj < 3; ++tj) {
box.insert(a[i + ti][j + tj]);
}
}
if (box.size() != 9) {
result = false;
}
}
}
if (result) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC327C)
基本的な考え方はC++と同じです。以下となります。
"""AtCoder Beginner Contest 327 C"""
a = [[0 for _ in range(9)] for _ in range(9)]
for i in range(9):
a[i] = list(map(int, input().split()))
result = True
for i in range(9):
row = set()
for j in range(9):
row.add(a[i][j])
if len(row) != 9:
result = False
for j in range(9):
col = set()
for i in range(9):
col.add(a[i][j])
if len(col) != 9:
result = False
for i in range(0, 9, 3):
for j in range(0, 9, 3):
box = set()
for ti in range(3):
for tj in range(3):
box.add(a[i + ti][j + tj])
if len(box) != 9:
result = False
print("Yes" if result else "No")
こちらも「AC」と判定されました。
最後に
趣味で、ナンバープレースを含むペンシルパズルを解いていました。なじみがある題材が出題されると、楽しくなります。
引き続き ABC の問題を紹介していきます。