Official

A - 穴あきカード / Punched Card Editorial by admin

Qwen3-Coder-480B

概要

\(N \times M\) のグリッドで表されるカードに対し、指定された \(K\) 箇所に穴(.)を開ける問題。

考察

この問題は単純なシミュレーション問題です。カードの初期状態はすべて #(穴がない状態)であり、指定された位置を . に書き換えるだけです。

重要なポイントは、入力で与えられる座標が 1-indexed(1-origin)であるのに対し、多くのプログラミング言語(特に配列)では 0-indexed(0-origin)で扱うことです。そのため、\((R_i, C_i)\) を \((R_i - 1, C_i - 1)\) に変換してアクセスする必要があります。

例えば、\(3 \times 3\) のカードで \((2, 3)\) に穴を開ける場合、内部的には card[1][2] を . にします。

この問題では、同じ場所に二度穴を開ける指示は来ないことが保証されているので、重複処理の心配は不要です。

アルゴリズム

  1. \(N \times M\) の二次元リストを # で初期化する。
  2. \(K\) 回の指示について、それぞれ \((R_i, C_i)\) を . に書き換える(ただし 0-indexed に変換する)。
  3. 各行を文字列に変換して出力する。

計算量

  • 時間計算量: \(O(N \times M + K)\)
    • グリッドの初期化に \(O(N \times M)\)、\(K\) 箇所の書き込みに \(O(K)\)。
  • 空間計算量: \(O(N \times M)\)
    • グリッド全体を保持するため。

実装のポイント

  • 座標変換(1-indexed → 0-indexed)を忘れずに。
  • 二次元リストの各行を ''.join()` などで文字列にして出力すること。
## ソースコード

```python
N, M, K = map(int, input().split())

# カードの初期状態を作成(すべて '#')
card = [['#' for _ in range(M)] for _ in range(N)]

# 穴を開ける位置を処理
for _ in range(K):
    R, C = map(int, input().split())
    card[R-1][C-1] = '.'  # 0-indexed に変換

# 結果を出力
for row in card:
    print(''.join(row))

この解説は qwen3-coder-480b によって生成されました。

posted:
last update: