PS

1018 체스판 다시 칠하기

Eastplanet 2021. 1. 8. 22:21
더보기

#include <iostream>
using namespace std;
char arr[51][51];
int x, y;
bool check(int a,int b) {
if (x - a < 0)return false;
else if (y - b < 0)return false;
else return true;
}

int change(int a1, int b1) {
char w = 'W';
char b = 'B';
char c='W';
int min = 9999999;
int count = 0;
for (int i = a1; i < a1+8; i++) {
for (int j = b1; j < b1+8; j++) {
if (arr[i][j] == c) {
if (c == w)c = b;
else c = w;
}
else {
if (c == w)c = b;
else c = w;
count++;
}
}
if (c == w)c = b;
else c = w;
}
if (min > count)min = count;
c = 'B';
count = 0;
for (int i = a1; i < a1+8; i++) {
for (int j = b1; j < b1+8; j++) {
if (arr[i][j] == c) {
if (c == w)c = b;
else c = w;
}
else {
if (c == w)c = b;
else c = w;
count++;
}
}
if (c == w)c = b;
else c = w;
}
if (min > count)min = count;
return min;
}

int main() {
int min=99999999;
cin >> x >> y;
for (int i = 1; i <= x; i++) {
for (int j = 1; j <= y; j++) {
cin >> arr[i][j];
}
}
//현재좌표가 체스판의 왼쪽위라고 생각하고 체스판을 잘라낼수있는지 검증하는함수
for (int i = 1; i <= x; i++) {
for (int j = 1; j <= y; j++) {
if (check(i, j)) {
int mem = change(i, j);
if (mem < min)min = mem;
}
}
}

//검증에 통과되면 배열을 W또는B로 시작했을때 바꿔야하는 칸의 수를 저장한다
cout << min;
//제일작은값 출력
}

브루트 포스를 이용하여 모든 경우의 수를 헤아려 보면 된다.

코드가 복잡해 질수록 함수를 따로 정의하여 쓰는게 간결하다고 생각된다