Official
A - スタンプラリー / Stamp Rally Editorial
by
A - スタンプラリー / Stamp Rally Editorial
by
physics0523
初心者の方へ
- AtCoder をはじめたばかりで何をしたらよいか分からない方は、まずは practice contest の問題A「Welcome to AtCoder」を解いてみてください。基本的な入出力の方法が載っています。
- また、プログラミングコンテストの問題に慣れていない方は、AtCoder Beginners Selection の問題をいくつか解いてみることをおすすめします。
- C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。
- Python入門 AtCoder Programming Guide for beginners (APG4bPython) は、競技プログラミングのための Python 入門用コンテンツです。
スタンプを押す様子を実際にシミュレートすればこの問題に正解できます。
まず、 \(H \times W\) の . のみからなる台紙を用意します。
その後、 \(N\) 回の押印が行われます。各押印は以下の二重ループで実現できます。
- \(i=1,2,\dots,R\) について、以下を繰り返す。
- \(j=1,2,\dots,C\) について、以下を繰り返す。
- 台紙の \((r+i,c+j)\) が範囲内であり、スタンプの上から \(i\) 行目、左から \(j\) 列目が
#であれば \((r+i,c+j)\) を#とする。
- 台紙の \((r+i,c+j)\) が範囲内であり、スタンプの上から \(i\) 行目、左から \(j\) 列目が
- \(j=1,2,\dots,C\) について、以下を繰り返す。
一連の判定は if 文を活用することで実現可能です。
実装例 (C++):
#include<bits/stdc++.h>
using namespace std;
int main(){
int H,W,R,C;
cin >> H >> W >> R >> C;
vector<string> sheet(H);
for(auto &nx : sheet){
for(int j=0;j<W;j++){nx.push_back('.');}
}
vector<string> S(R);
for(auto &nx : S){cin >> nx;}
int N;
cin >> N;
while(N--){
int r,c;
cin >> r >> c;
r--; c--;
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
int ni=r+i;
int nj=c+j;
if(!(0<=ni && ni<H)){continue;}
if(!(0<=nj && nj<W)){continue;}
if(S[i][j]=='#'){sheet[ni][nj]='#';}
}
}
}
for(auto &nx : sheet){cout << nx << "\n";}
return 0;
}
