見出し画像

pictureframeの問題を解くためのメモ

atcoderのpictureframeという問題を解こうとして時間がかなりかかってしまったのでメモ

縦H×横Wの文字を入力して、その文字の周囲を#で囲むという問題です。

例1)

入力
1 1
a

出力
###
#a#
###

例2)

入力
2 2
ab
cd

出力
####
#ab#
#cd#
####

最初考えた解き方



入力した文字に対する枠は、入力した文字のHの縦方向に+2して#で縦の枠をつくる。
Wの横方向にも+2して#で横の枠をつくるという考えでよさそう。

vectorの2次元配列をH+2, W+2で作っておき、枠の内側となる添え字に、cinで入力した文字をループで代入する。

枠に値する添え字は空文字となっているので、for文でvectorの2次元配列をループし、ifで添え字の要素が空文字かを判定し、空文字なら#を代入する。

という考え方で解こうとしました。

#include <bits/stdc++.h>
using namespace std;
int main() {
       int H, W;
       cout << "H,Wを入力してください" << endl;
       cin >> H >> W;
       H += 2;
       W += 2;
       vector<vector<char>> data(H, vector<char>(W));
       // 入力文字をフレームの内側に代入
       for(int i = 1; i < H-1; i++){
               for(int j = 1; j < W-1; j++){
                       cin >> data.at(i).at(j);
               }
       }
       // 枠は空文字となっているのでそこに#を代入
       for(int i = 0; i < H; i++){
               for(int j = 0; j < W; j++){
                       if(data.at(i).at(j) == ' '){
                               data.at(i).at.(j) = '#';
                       } else {
                               continue;
                       }
               }
       }
       // 出力
       for(int i = 0; i < H; i++){
               for(int j = 0; j < W; j++){
                       cout << data.at(i).at(j);
               }
               cout << endl;
       }
       return 0;
}

でも上記では出力すると#が代入されていないのか、入力した文字以外は何も表示されません。

正解となった解答

vectorの2次元配列を作った時点で#ですべての添え字の要素を初期化しておく。そして、入力する文字で上書きする感じにしました。

これだとうまくいきました。

#include <bits/stdc++.h>
using namespace std;
int main() {
int H, W;
cin >> H >> W;
H += 2;
W += 2;
vector<vector<char>> data(H, vector<char>(W, '#'));
// input文字をフレームの内側に代入
       for(int i = 1; i < H-1; i++){
               for(int j = 1; j < W-1; j++){
                       cin >> data.at(i).at(j);
               }
       }
       // 出力
       for(int i = 0; i < H; i++){
               for(int j = 0; j < W; j++){
                      cout << data.at(i).at(j);
               }
               cout << endl;
       }
       return 0;
}


この記事が気に入ったらサポートをしてみませんか?