atcoder ABC 300 B - Same Map in the RPG World の実装(Python)

atcoder.jp

この問題ではPythonのNumpyのrollを使うと簡単に解けます。(参考:NumPy配列ndarrayをシフト(スクロール)させるnp.roll | note.nkmk.me)

・考え方:A,Bをndarrayにして、for文でAをH行とW列の数シフトさせる。最後に一致する場合はYesを出力して終了。

・注意:np.roll(A,0)はAを0回シフトすることを意味する。よって初めの入力でA=BだったとしてもYesと出力できる。

・実装例

import numpy as np
H,W=map(int,input().split())
A_= []
for _ in range(H):
    A_.append(list(input()))
B_= []
for _ in range(H):
    B_.append(list(input()))

A=np.array(A_)  #ndarrayにする
B=np.array(B_)

for i in range(H):  
  for j in range(W):
    Ar0=np.roll(A,i,axis=0)  #行をi回シフトする
    Ar1=np.roll(Ar0,j,axis=1) #列をj回シフトする
    if np.array_equal(Ar1,B):  #AをシフトしたものがBと等しいか
      print("Yes")
      exit()
print("No")