나의 브을로오그으

[c++] 1018번 : 체스판 다시 칠하기 본문

알고리즘/BaekJoon

[c++] 1018번 : 체스판 다시 칠하기

__jhp_+ 2022. 3. 15. 14:20

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

#include <iostream>

using namespace std;

int countOfModifyBlock(char aInputBoard[][51], int x, int y, char aBlackBoard[][8], char aWhiteBoard[][8])
{
	int nWCnt = 0;
	int nBCnt = 0;
	for (int i = 0; i < 8; ++i)
	{
		for (int j = 0; j < 8; ++j)
		{
			nBCnt += aInputBoard[y + i][x + j] - aBlackBoard[i][j] == 0 ? 0 : 1;
			nWCnt += aInputBoard[y + i][x + j] - aWhiteBoard[i][j] == 0 ? 0 : 1;
		}
	}

	return nBCnt < nWCnt ? nBCnt : nWCnt;
}

int Abs(int n)
{
	return n < 0 ? ~n + 1 : n;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	// setup
	char aBlock[2] = { 'B', 'W' };
	char aBlackBoard[8][8] = { 0, };
	char aWhiteBoard[8][8] = { 0, };
	for (int i = 0; i < 8; ++i)
	{
		for (int j = 0; j < 8; ++j)
		{
			int nbx = Abs(i % 2 - j % 2);
			int nwx = Abs(1 - i % 2 - j % 2);
			aBlackBoard[i][j] = aBlock[nbx];
			aWhiteBoard[i][j] = aBlock[nwx];
		}
	}

	// input
	char aInputBoard[51][51] = { 0, };
	int nWidth = 0;
	int nHeight = 0;
	int nCnt = 32;
	cin >> nHeight >> nWidth;
	
	for (int i = 0; i < nHeight; ++i)
	{
		cin >> aInputBoard[i];
	}

	// calc
	for (int i = 0; i <= nHeight - 8; ++i)
	{
		for (int j = 0; j <= nWidth - 8; ++j)
		{
			int nTempCnt = countOfModifyBlock(aInputBoard, j, i, aBlackBoard, aWhiteBoard);
			nCnt = nTempCnt < nCnt ? nTempCnt : nCnt;
		}
	}

	// output
	cout << nCnt << "\n";
	return 0;
}

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

[c++] 1181번 : 단어 정렬  (0) 2022.03.20
[c++] 1085번 : 직사각형에서 탈출  (0) 2022.03.15
[c++] 11720번 : 숫자의 합  (0) 2022.03.12
[c++] 10869번 : 사칙연산  (0) 2022.03.12
[c++] 10818번 : 최소, 최대  (0) 2022.03.12