はじめに
2023年卒の学生です.
言語化の練習 & 備忘録として今回からpaizaラーニングの問題をC,C++で解説していきます.
まだまだ拙いと思いますがよろしくお願いします.
対象者
この記事は下記のような人を対象にしています。
- C,C++で競技プログラミングpaizaを使っている人
- プログラミング初学者
- 駆け出しエンジニア
今回の解説する問題
説明文
マップの行数 H と列数 W とマップを表す H 行 W 列の文字列 S_1 ... S_H が与えられるので、
隣接する上下左右のマスが全て '#' であるマスの y , x 座標 を答えてください。
ただし、左端のマスの場合は「右のマスが '#' 」であれば、右端のマスの場合は「左のマスが '#' 」であれば隣接する左右のマスが全て '#' であるものとします。
また、上端のマスの場合は「下のマスが '#' 」であれば、下端のマスの場合は「上のマスが '#' 」であれば隣接する上下のマスが全て "#" であるものとします。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
入力される値
・ 1 行目には盤面の行数を表す整数 H , 盤面の列数を表す整数 W が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、 S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。(0 ≦ j < W)
期待される出力
N (1 ≦ N ≦ H×W) 行の出力
・ 条件を満たすマスの y , x 座標を出力してください。
・ 左上 (y = 0, x = 0) のマスから順に、x 座標 , y 座標の順で増加するように出力してください。詳しくは入出力例を参考にしてください。
条件
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ H, W ≦ 20
・ S は W 文字の文字列
・ S の各文字は '.' または '#'
・ 条件を満たすマスが少なくとも 1 つ以上存在します
入力例
//入力例
3 3
##.
###
...
//出力例
0 0
0 2
//入力例
10 10
##########
..........
##########
##########
..........
#.#.#.#.#.
.#.#.#.#.#
#.#.#.#.#.
.#.#.#.#.#
..........
//出力例
6 0
6 2
6 4
6 6
6 8
7 1
7 3
7 5
7 7
7 9
コード
#include <iostream>
using namespace std;
int main(void){
//縦,横の値入力
int H,W;
cin>>H>>W;
//map入力
char N[H][W];
for(int h = 0; h < H; h++){//縦
for(int w = 0; w< W; w++){//横
cin>>N[h][w];
}
}
for(int h = 0; h < H; h++){//縦
for(int w = 0; w< W; w++){//横
//チェック
if((h <= 0 || N[h-1][w] == '#')//上
&&(h >= H-1 || N[h+1][w] == '#')//下
&&(w <= 0 || N[h][w-1] == '#')//左
&&(w >= W-1 || N[h][w+1] == '#')//右
){
//値出力
cout<<h<<" "<<w<<endl;
}
}
}
return 0;
}
おわりに
今回はマップの判定・縦横 (paizaランク B 相当)を解いてみました.
初めての技術ブログで分かりやすいコードを書けてないと思うので
気軽にコメントしてもらえれば随時更新していきますのでよろしくお願いします.
また書いて欲しい問題も随時募集中です.