公式

A - スタンプラリー / Stamp Rally 解説 by physics0523 印刷ページ


初心者の方へ


スタンプを押す様子を実際にシミュレートすればこの問題に正解できます。

まず、 \(H \times W\) の . のみからなる台紙を用意します。
その後、 \(N\) 回の押印が行われます。各押印は以下の二重ループで実現できます。

  • \(i=1,2,\dots,R\) について、以下を繰り返す。
    • \(j=1,2,\dots,C\) について、以下を繰り返す。
      • 台紙の \((r+i,c+j)\) が範囲内であり、スタンプの上から \(i\) 行目、左から \(j\) 列目が # であれば \((r+i,c+j)\) を # とする。

一連の判定は 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;
}

投稿日時:
最終更新: