atcoder ABC 312 B - TaK Codeの復習

atcoder.jp

・説明:左上と右下が一致しているか愚直にif文を書く。一致していたらflad,cntを加算する。全部一致したらOK。

n,m=map(int, input().split())
s=[input() for _ in range(n)]

ans=[]
for i in range(n-8):
  for j in range(m-8):
    flag=0
    cnt=0
    if i<0 or i>=n or j<0 or j>=m:  #範囲外はスルー
      continue

    #左上が一致しているか。
    for k in range(4):
      #k=3のときは4列目なので全部の'.'じゃないとだめ
      if k==3 :
        if s[i][j+k]=='.' and s[i+1][j+k]=='.' and s[i+2][j+k]=='.' and s[i+3][j+k]=='.':
          flag+=1  
      else:
        if s[i][j+k]=='#' and s[i+1][j+k]=='#' and s[i+2][j+k]=='#' and s[i+3][j+k]=='.':
          flag+=1

    #右下が一致しているか。
    for l in range(4):
      if l==0:
        if s[i+5][j+5+l]=='.' and s[i+6][j+5+l]=='.' and s[i+7][j+5+l]=='.' and s[i+8][j+5+l]=='.':
          cnt+=1
      else:
        if s[i+5][j+5+l]=='.' and s[i+6][j+5+l]=='#' and s[i+7][j+5+l]=='#' and s[i+8][j+5+l]=='#':
          cnt+=1
    if flag==4 and cnt==4:  
      ans.append((i+1,j+1))
for i,j in ans:
  print(i,j)