$O(nm)$
#include<cstdio> #include<algorithm> using namespace std; int n, m, r = 1e9; char s[50][51]; int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%s", s + i); for (int i = 0; i + 7 < n; i++) { for (int j = 0; j + 7 < m; j++) { int c = 0; for (int k = i; k < i + 8; k++) for (int l = j; l < j + 8; l++) c += s[k][l] == 'B' ^ k + l & 1; r = min({ r,c,64 - c }); } } printf("%d", r); return 0; }
안녕하세요 운영자님 덕분에 감사하게도 코드 공부를 하고 있는 학생입니다.
답글삭제궁금한 점이 있는데 for문 맨 마지막에 c += s[k][l] == 'B' ^ k + l & 1; 를 어떻게 해석할 수 있을까요?
우선순위가 헷갈려서요;; 답변해주시면 감사하겠습니다! ㅎㅎ
연산자가 +, ==, &, ^ 순으로 연산합니다.
삭제따라서 주어진 식은 (s[k][l]=='B')^((k+l)&1)와 같습니다.
x&1은 홀수이면 1 짝수이면 0 이고
(k+l)&1을 하면 [k][l] 배열이 체스판처럼 1,0 이 번갈아 나오도록 만들 수 있습니다.
다른 수를 ^하면 1 이 되므로
체스판에서 0, s[k][l]=='B'
체스판에서 1, s[k][l]=='W'
일 때 카운트 됩니다.