Moloco의 Tap Titanz (Hard)

n x n 두 색 칸판에서 한 번 누르면 같은 색으로 연결된 영역 전체가 뒤집힐 때, 칸판 전체를 한 색으로 만드는 최소 횟수를 구한다.

보통7그래프BFS그리디동적 계획법아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

Moloco 직원 중에는 Tap Titanz 같은 클리커 게임을 즐기는 사람이 있다.

Tap Titanz는 각 칸이 검은색이거나 흰색인 n×nn \times n 판에서 진행한다. 변을 맞대고 있는 두 칸은 인접하다고 한다. 같은 색 칸만 거쳐 인접한 칸을 따라 한 칸에서 다른 칸까지 갈 수 있으면 두 칸은 연결되어 있다고 한다. 연결된 두 칸의 색은 항상 같다.

플레이어가 칸 하나를 누르면 그 칸의 색이 반대 색으로 바뀌고, 그 칸과 같은 색이던 인접한 칸, 다시 그 칸과 같은 색이던 인접한 칸도 차례로 색이 바뀐다. 즉, 누른 칸과 그 칸에 연결된 모든 칸의 색이 동시에 반대 색으로 바뀐다.

모든 칸의 색이 같아지면, 그러니까 전부 검은색이거나 전부 흰색이 되면 게임이 끝난다. 누르는 횟수를 최소로 하는 것이 목표이다.

입력

첫째 줄에 정수 nn이 주어진다. (1n251 \le n \le 25)

다음 nn개의 줄에 판의 각 행이 위에서부터 순서대로 주어진다. 각 줄은 길이가 nn인 문자열이고, 'B'는 검은색 칸, 'W'는 흰색 칸을 뜻한다.

출력

모든 칸의 색을 같게 만들기 위해 눌러야 하는 최소 횟수를 한 줄에 출력한다.