슈뢰딩거의 고등어

[백준] 1018 체스판 다시 칠하기 본문

알고리즘

[백준] 1018 체스판 다시 칠하기

슈뢰딩거의 고등어 2022. 3. 19. 19:56

 

[해결방법]

체스판을 채우는 방법은 2가지임으로

2가지 케이스에 해당하는 체스판을 answer에 저장한다.

 

주어진 판으로 생성할수 있는 모든 8*8 판에 대해 확인한다.

answer[] 와 생성한 판과의 차이가 얼마나 나는지 확인한다.

최소 차이를 result 로 업데이트한다.

#include <iostream>
#include <cstring>
using namespace std;
int n, m;
int y, x;
string map[59];
string answer[2][10];
int result = 987654321;

void check_board(int cy, int cx) {
	int case_1 = 0;
	int case_2 = 0;

	for(int i=0; i<8; i++) {
		for(int j=0; j<8; j++) {
			if(answer[0][i][j] != map[cy+i][cx+j]) 
				case_1++;
			
			if(answer[1][i][j] != map[cy+i][cx+j])
				case_2++;
		}
	}
	result = min(result, case_1);
	result = min(result, case_2);
} 

int main() {
	scanf("%d %d", &n, &m);

	for(int i=0; i<n; i++) {
		cin >> map[i];
	}

	string a = "BWBWBWBW";
	string b = "WBWBWBWB"; 
	for(int i=0; i<8; i++){
		answer[0][i] = a;
		answer[1][i] = b;
		string tmp = a;
		a = b;
		b = tmp;
	}


	for(int i=0; i<=n-8; i++)
		for(int j=0; j<=m-8; j++)
				check_board(i, j);

	cout << result << endl;
}
Comments