시나브로

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

알고리즘/백준

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

혬혬 2019. 12. 31. 17:07
728x90

먼저 white로 시작하는 체스판과 black으로 시작하는 체스판을 만들어 놓고 비교한다

모든 점을 시작점으로 하는 완전 탐색을 해서 최솟값을 찾았다. 

#include<stdio.h>
#include<vector>
#include<iostream>
#include <algorithm>
using namespace std;
int main(void) {
	freopen("inp.inp", "r", stdin);
	freopen("out.out", "w", stdout);
	int white[50][50] = { 0 };
	int black[50][50] = { 0 };
	int board[50][50] = { 0 };
	bool signal = 0;
	int n = 0, m = 0;
	scanf("%d %d", &n, &m);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			white[i][j] = signal;
			black[i][j] = !signal;
			signal = !signal;
		}
		if(m%2==0)
		signal = !signal;
	}
	char box = 0;
	scanf("%c", &box);
	int s = 0;
	int min = 1000000;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			scanf("%c", &box);
			if (box == 'W') 
				board[i][j] = 1;
			else
				board[i][j] = 0;
		}
		scanf("%c", &box);
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			int white_total = 0;
			int black_total = 0;
			if (i + 8 <= n&&j + 8 <= m) {
				for (int q = i; q < i + 8; q++) {
					for (int p = j; p < j + 8; p++) {
						s = board[q][p];
						if (white[q][p] != s)
							white_total++;
						if (black[q][p] != s)
							black_total++;
					}
				}
				if (white_total < min)
					min = white_total;
				if (black_total < min)
					min = black_total;
			}
		}
	}
	printf("%d", min);

	return 0;
}

 

 

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

1551. 수열의 변화  (0) 2020.01.13
8393 합  (0) 2020.01.09
[백준] 7568번 덩치  (0) 2019.12.31
[백준] 2231번 분해합  (0) 2019.12.31
[백준] 2798 번 블랙잭  (0) 2019.12.31
Comments