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

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

AtCoder ABC 294 B - ASCII Art (7Q, 灰色, 200 点)

二次元配列の練習問題

問題概要

 H \times W の形状に並べられた行列が与えられる。行列の各要素は 0 以上 26 以下の整数値である。

今、この行列の各要素に対応して

  • 0 は文字 '.' に
  • 1〜26 はそれに対応するアルファベット文字に

置き換えて得られる  H \times W の二次元文字列を出力せよ。

考えたこと

 H \times W の形状に並べられた行列  A は、C++ では vector<vector<int>> 型で管理できる。たとえば、次のように宣言する。

vector<vector<int>> A(H, vector<int>(W));

そして、この行列  A の上から  i 番目 (一番上を 0 番目とする)、左から  j 番目 (一番左を 0 番目とする) の要素  A_{i, j} は、プログラムでは A[i][j] と表せる。また、行列  A の各要素にアクセスする処理は、次のような二重 for 文で表せる。

for (int i = 0; i < H; ++i) {
    for (int j = 0; j < W; ++j) {
            // A[i][j] に関する処理

    }
}

このことに注意して、実装していこう。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int H, W;
    cin >> H >> W;
    vector<vector<int>> A(H, vector<int>(W));
    for (int i = 0; i < H; ++i) {
        for (int j = 0; j < W; ++j) {
            cin >> A[i][j];
        }
    }
    
    for (int i = 0; i < H; ++i) {
        for (int j = 0; j < W; ++j) {
            if (A[i][j] == 0) cout << '.';
            else cout << (char)('A' + A[i][j] - 1);
        }
        cout << endl;
    }
}