🎃

AtCoder Beginner Contest 300 - B

2023/05/05に公開

問題
https://atcoder.jp/contests/abc300/tasks/abc300_b

概要
行列Aを縦方向、右方向にそれぞれ任意の回数シフトさせた際に、行列Bと一致させることが可能かどうかを判定する。

解法
行列Aについて、縦方向にシフトさせる回数、横方向にシフトさせる回数を、全探索すればよいです。
縦方向にシフトさせる回数をdown、横方向にシフトさせる回数をrightと決めた際、
行列Aの座標(i + down, j + right)が行列B(i,j)と一致するかどうかを全てのi,jについてチェックして完全に一致するかどうかを見ればよいです。
ちなみに、縦方向→横方向の順にずらした場合と、横方向→縦方向の順にずらした場合とで
結果は変わらないので、どちらか一方のみの確認だけでよいです。
図は行列Aについて、座標のマスを左上から順番に番号を振った際に、シフトの操作を行った場合のイメージです。

ソースコード

abc300b.py
h, w = map(int, input().split())
a = [input() for i in range(h)]
b = [input() for i in range(h)]

def is_same(a, b, down, right):
	for i in range(h):
		for j in range(w):
			nai = (i + down) % h
			naj = (j + right) % w
			if(a[nai][naj] != b[i][j]):
				return False
	return True

for i in range(h):
	for j in range(w):
		if(is_same(a, b, i, j)):
			print("Yes")
			exit()
print("No")

Discussion