結果
問題 | No.565 回転拡大 |
ユーザー | shinchan |
提出日時 | 2023-05-13 02:17:20 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 5,974 bytes |
コンパイル時間 | 1,293 ms |
コンパイル使用メモリ | 90,496 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-11-28 22:20:48 |
合計ジャッジ時間 | 2,471 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,820 KB |
testcase_01 | AC | 2 ms
6,816 KB |
testcase_02 | AC | 2 ms
6,816 KB |
testcase_03 | AC | 2 ms
6,816 KB |
testcase_04 | AC | 2 ms
6,816 KB |
testcase_05 | AC | 2 ms
6,816 KB |
testcase_06 | AC | 2 ms
6,816 KB |
testcase_07 | AC | 2 ms
6,820 KB |
testcase_08 | AC | 3 ms
6,820 KB |
testcase_09 | AC | 2 ms
6,820 KB |
testcase_10 | AC | 2 ms
6,820 KB |
testcase_11 | AC | 2 ms
6,816 KB |
testcase_12 | AC | 2 ms
6,816 KB |
testcase_13 | AC | 2 ms
6,820 KB |
testcase_14 | AC | 2 ms
6,820 KB |
testcase_15 | AC | 2 ms
6,816 KB |
testcase_16 | AC | 2 ms
6,816 KB |
testcase_17 | AC | 2 ms
6,820 KB |
testcase_18 | AC | 2 ms
6,820 KB |
testcase_19 | AC | 2 ms
6,820 KB |
testcase_20 | AC | 2 ms
6,816 KB |
testcase_21 | AC | 2 ms
6,816 KB |
testcase_22 | AC | 2 ms
6,820 KB |
testcase_23 | AC | 2 ms
6,816 KB |
testcase_24 | AC | 2 ms
6,820 KB |
testcase_25 | AC | 2 ms
6,816 KB |
testcase_26 | AC | 2 ms
6,820 KB |
testcase_27 | AC | 2 ms
6,820 KB |
testcase_28 | AC | 2 ms
6,816 KB |
testcase_29 | AC | 2 ms
6,820 KB |
testcase_30 | AC | 2 ms
6,820 KB |
testcase_31 | AC | 2 ms
6,816 KB |
testcase_32 | AC | 2 ms
6,824 KB |
ソースコード
#line 1 "yukicoder-rotate-enlarge_1.test.cpp" #define PROBLEM "https://yukicoder.me/problems/no/565" #line 2 "/mnt/c/Users/shinc/atcoder/library/cpp/matrix.hpp" #include <vector> #include <string> #include <algorithm> /** * @brief 行列 * @tparam T 型 行列(グリッド)の要素となるintやchar */ template<class T> struct Matrix { std::vector<std::vector<T>> v; int n, m; /** * @brief コンストラクタ * @param v 行列(グリッド)の元となる vector<string> や vector<vector<T>> * @return Matrix */ template <typename Iterable> constexpr Matrix(const std::vector<Iterable>& v_) noexcept : n(v_.size()), m(v_.size() == 0 ? 0 : v_[0].size()) { v.resize(n); for(int i = 0; i < n; i++) { v[i].assign(v_[i].begin(), v_[i].end()); } } /** * @brief コンストラクタ * @param _n 行列(グリッド)の行数 * @param _m 行列(グリッド)の列数 * @param _val 行列(グリッド)の要素の初期値 * @return Matrix */ constexpr Matrix(int _n, int _m, T _val) : v(n, std::vector<T>(m, _val)) {} constexpr auto begin() noexcept {return v.begin();} constexpr auto end() noexcept {return v.end();} /** * @brief 行列(グリッド)の行数 * @return size_t */ constexpr size_t size() const {return v.size();} std::vector<T>& operator [] (int i) {return v[i];} /** * @brief 転置 * @return Matrix */ [[nodiscard]] constexpr Matrix transpose() noexcept { if(n == 0) return Matrix(v); std::vector<std::vector<T>> ret(m); for(int i = 0; i < m; i ++) { ret[i].resize(n); for(int j = 0; j < n; j ++) ret[i][j] = v[j][i]; } return Matrix(ret); } /** * @brief 左右反転 * @return Matrix */ [[nodiscard]] constexpr Matrix rev_lr() noexcept { std::vector<std::vector<T>> ret = v; for(int i = 0; i < n; i ++) std::reverse(ret[i].begin(), ret[i].end()); return Matrix(ret); } /** * @brief 上下反転 * @return Matrix */ [[nodiscard]] constexpr Matrix rev_ud() noexcept { std::vector<std::vector<T>> ret = v; reverse(ret.begin(), ret.end()); return Matrix(ret); } /** * @brief 時計周りに90度回転 * @param k 回転する回数 * @return Matrix */ [[nodiscard]] constexpr Matrix rotate(int k) noexcept { k %= 4; if(k == 0) return *this; if(k < 0) k += 4; if(k == 2) return this->rev_lr().rev_ud(); std::vector<std::vector<T>> ret(m); if(k == 1) { for(int i = 0; i < m; i ++) { ret[i].resize(n); for(int j = 0; j < n; j ++) ret[i][j] = v[n - j - 1][i]; } } else { for(int i = 0; i < m; i ++) { ret[i].resize(n); for(int j = 0; j < n; j ++) ret[i][j] = v[j][m - i - 1]; } } return Matrix(ret); } /** * @brief (i, j)を((i + dy) mod n, (j + dx) mod m)に移動 * @return Matrix */ [[nodiscard]] constexpr Matrix shift(int dy, int dx) noexcept { std::vector<std::vector<T>> ret = v; for(int i = 0, ni = dy; i < n; i ++, ni ++) { if(ni >= n) ni = 0; for(int j = 0, nj = dx; j < m; j ++, nj ++) { if(nj >= m) nj = 0; ret[ni][nj] = v[i][j]; } } return Matrix(ret); } /** * @brief 左にk回シフト * @return Matrix */ [[nodiscard]] constexpr Matrix shift_l(int k) noexcept { return this->shift(0, -k); } /** * @brief 右にk回シフト * @return Matrix */ [[nodiscard]] constexpr Matrix shift_r(int k) noexcept { return this->shift(0, k); } /** * @brief 上にk回シフト * @return Matrix */ [[nodiscard]] constexpr Matrix shift_u(int k) noexcept { return this->shift(-k, 0); } /** * @brief 下にk回シフト * @return Matrix */ [[nodiscard]] constexpr Matrix shift_d(int k) noexcept { return this->shift(k, 0); } /** * @brief グリッドをvector<string>で返す * @return std::vector<std::string> */ [[nodiscard]] constexpr std::vector<std::string> vstr() noexcept { std::vector<std::string> ret(n); for(int i = 0; i < n; i ++) { ret[i].assign(v[i].begin(), v[i].end()); } return ret; } /** * @brief グリッドのj列目を返す * @param j 返す列番号(0-indexed) * @return std::vector<T> */ [[nodiscard]] constexpr std::vector<T> col(int j) noexcept { std::vector<T> ret(n); for(int i = 0; i < n; i ++) { ret[i] = v[i][j]; } return ret; } /** * @brief グリッドのi行目をstringで返す * @param i 返す行番号(0-indexed) * @return std::string */ [[nodiscard]] constexpr std::string str(int i) noexcept { std::string ret; ret.assign(v[i].begin(), v[i].end()); return ret; } }; #line 4 "yukicoder-rotate-enlarge_1.test.cpp" #include <iostream> #line 6 "yukicoder-rotate-enlarge_1.test.cpp" std::string extend(std::string s, int k) { std::string ret = ""; for(char c : s) ret += std::string(k, c); return ret; } int main() { int r, k, h, w; std::cin >> r >> k >> h >> w; std::vector<std::string> c(h); for(int i = 0; i < h; i ++) std::cin >> c[i]; Matrix<char> mat(c); for(int i = 0; i < r; i += 90) mat = mat.transpose().rev_lr(); for(auto s : mat.vstr()) { std::string t = extend(s, k); for(int i = 0; i < k; i ++) std::cout << t << std::endl; } return 0; }