公式

D - TaK Code 解説 by kyopro_friends


\((i,j)\) の辞書順に「上から \(i\) 行目左から \(j\) 列目を左上とする縦 \(9\) マス横 \(9\) マスの領域がTaK Code の条件を満たすか」を判定し、満たすならばその場で \((i,j)\) を出力すればよいです。

for i = 1..N-8 :
  for j = 1..M-8 :
    if (i,j)を左上とする領域が条件を満たす:
      print(i,j)

配列外参照をしないよう、\(i,j\) のループ範囲に注意してください。

判定部分は次のように、真偽値を返す関数を用意します。

func check(i, j):
  // 左上の黒をチェック
  for ii = 0..2 :
    for jj = 0..2 :
      if S[i+ii][j+jj] != '#':
        return false
  // 右下の黒をチェック
  for ii = 6..8 :
    for jj = 6..8 :
      if S[i+ii][j+jj] != '#':
        return false
  // 左上の白をチェック
  for ii = 0..3:
    if S[i+ii][j+3] != '.':
      return false
  for jj = 0..3:
    if S[i+3][j+jj] != '.':
      return false
  //右下の白をチェック
  for ii = 5..8:
    if S[i+ii][j+5] != '.':
      return false
  for jj = 5..8:
    if S[i+5][j+jj] != '.':
      return false
  // 全ての条件を満たす
  return true

writer解(C)

投稿日時:
最終更新: