첫번째 경우는
홀수 번째 줄이 BWBWBWBW라면
짝수 번째 줄은 WBWBWBWB여야한다.두번째 경우는
홀수 번째 줄이 WBWBWBWB라면
짝수 줄은 BWBWBWBW여야 한다.풀이
반복문을 통해 8X8크기의 정사각형의 체스판을 얻은 후
경우에 따라 최소한의 색칠수를 구하고 두 경우의 최소값을 구한다.
그 다음 부턴, 최소값과 반복과정을 통해 나온 최소의 수를 비교해
최종적으로 가장 적게 칠하는 경우를 출력해주면 된다.
https://www.acmicpc.net/problem/1018
#include <iostream>
using namespace std;
int main()
{
int col, row;
cin >> row >> col;
char **arr = new char*[row];
char ans[2][8] = {{'W','B', 'W','B', 'W','B', 'W','B'},
{'B', 'W','B', 'W','B', 'W','B', 'W'}};
for(int i = 0; i < row; i++)
arr[i] = new char[col];
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
cin >> arr[i][j];
}
}
int c = 0, r = 0;
int result = INT32_MAX;
while(r + 7 < row)
{
int cnt_W = 0;
int cnt_B = 0;
int tmp = 0;
for(int i = r; i < r + 8; i++)
{
for(int j = c; j < c + 8; j++)
{
if(tmp % 2 == 0)
{
if (arr[i][j] != ans[0][j - c])
cnt_W++;
}
else
{
if(arr[i][j] != ans[1][j - c])
cnt_W++;
}
}
tmp++;
}
for(int i = r; i < r + 8; i++)
{
for(int j = c; j < c + 8; j++)
{
if(tmp % 2 == 0)
{
if(arr[i][j] != ans[1][j - c])
cnt_B++;
}
else
{
if(arr[i][j] != ans[0][j - c])
cnt_B++;
}
}
tmp++;
}
int min = cnt_B > cnt_W ? cnt_W : cnt_B;
if (result > min)
{
result = min;
}
if(c + 8 >= col){
c = 0;
r++;
}
else
c++;
}
cout << result << endl;
for(int i = 0; i < row; i++)
delete [] arr[i];
delete [] arr;
}