C++の練習を兼ねて, AtCoder Beginner Contest 036 の 問題B(回転) ~ 問題C(座圧) を解いてみた.
■感想.
1. 問題B は, マス目を時計回りに, 90度回転させる問題で, 個人的には, 非常に面白く感じた.
2. 問題C は, 座圧データの種類を抽出し, 小さい順に, 0 から 採番すれば良いことに気付いたので, 解答に到達できた.
3. 問題D は, 現状, 解ける気がしないため, とりあえず放置(汗).
本家のサイトABC #036 解説をご覧下さい.
■C++版プログラム(問題B/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i = (a); i < (b); ++i) int main() { // 1. 入力情報取得. int N; cin >> N; string S[N]; FOR(i, 0, N) cin >> S[i]; string ans[N]; string line = ""; FOR(i, 0, N) line += {'#'}; FOR(i, 0, N) ans[i] = line; // 2. マス目を時計回りに90度回転. // (i, j) -> (j, N - i - 1) に移動. FOR(i, 0, N) FOR(j, 0, N) ans[j][N - i - 1] = S[i][j]; // 3. 出力 ~ 後処理. FOR(i, 0, N) cout << ans[i] << endl; return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
[入力例] 1 o [出力例] o [入力例] 2 ox xo [出力例] xo ox [入力例] 7 ooxxoox xooxxoo oxooxxo ooxooxx xooxoox xxooxoo oxxooxo [出力例] oxxooxo xxooxoo xooxoox ooxooxx oxooxxo xooxxoo ooxxoox |
■C++版プログラム(問題C/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <bits/stdc++.h> using namespace std; typedef long long LL; #define FOR(i, a, b) for(int i = (a); i < (b); ++i) int main() { // 1. 入力情報取得. int N; cin >> N; LL A[N] = {}; map<LL, int> m; FOR(i, 0, N) { LL a; cin >> a; A[i] = a; m[a]++; } // 2. map の 値 を, 0 から 採番し直す. int index = 0; for(auto &p : m) { p.second = index; index++; } // 3. 数列 b1 ~ bN を計算. LL ans[N] = {}; FOR(i, 0, N) ans[i] = m[A[i]]; // 4. 出力 ~ 後処理. FOR(i, 0, N) cout << ans[i] << endl; return 0; } |
■参照サイト
AtCoder Beginner Contest 036