https://www.acmicpc.net/problem/1018
from sys import stdin
input = stdin.readline
# 입력
n, m = map(int, input().split())
board = []
for _ in range(n):
data = list(input().strip())
board.append(data)
# 정사각형 개수의 최솟값을 저장하는 min_paint
min_paint = None
# 순회하면서 8*8 판으로 나눠본다
for row in range(n):
for col in range(m):
# 8*8 판으로 나눌 수 있는 경우
if row + 8 <= n and col + 8 <= m:
# 가장 좌측 상단이 W여야 할 때, 칠해야하는 칸의 개수
W_paint = 0
# 가장 좌측 상단이 B여야 하 때, 칠해야하는 칸의 개수
B_paint = 0
# 가장 좌측 상단이 W로 칠해져야 하는 경우 -> B이면 다시 색칠
# 가장 좌측 상단이 B로 칠해져야 하는 경우 -> W이면 다시 색칠
for r in range(0, 8, 2):
for c in range(0, 8, 2):
if board[row+r][col+c] == "W":
B_paint += 1
else:
W_paint += 1
# 가장 좌측 상단이 W로 칠해져야 하는 경우 -> B이면 다시 색칠
# 가장 좌측 상단이 B로 칠해져야 하는 경우 -> W이면 다시 색칠
for r in range(1, 8, 2):
for c in range(1, 8, 2):
if board[row + r][col + c] == "W":
B_paint += 1
else:
W_paint += 1
# 가장 좌측 상단이 W로 칠해져야 하는 경우 -> W이면 다시 색칠
# 가장 좌측 상단이 B로 칠해져야 하는 경우 -> B이면 다시 색칠
for r in range(0, 8, 2):
for c in range(1, 8, 2):
if board[row + r][col + c] == "W":
W_paint += 1
else:
B_paint += 1
# 가장 좌측 상단이 W로 칠해져야 하는 경우 -> W이면 다시 색칠
# 가장 좌측 상단이 B로 칠해져야 하는 경우 -> B이면 다시 색칠
for r in range(1, 8, 2):
for c in range(0, 8, 2):
if board[row + r][col + c] == "W":
W_paint += 1
else:
B_paint += 1
# 만약 W_paint나 B_paint의 값이 0이면 아무데도 칠하지 않아도 됨
# 우리의 목적은 최소 개수를 구하므로 여기서 중단
if W_paint == 0 or B_paint == 0:
min_paint = 0
break
# W_paint와 B_paint를 비교해서 작은 값을 min_paint와 비교한다
temp_min_paint = None
if W_paint < B_paint:
temp_min_paint = W_paint
else:
temp_min_paint = B_paint
if min_paint is None:
min_paint = temp_min_paint
else:
# temp_min_paint가 min_paint보다 작으면 paint의 값을 저장
if min_paint > temp_min_paint:
min_paint = temp_min_paint
# 출력
print(min_paint)