문제 출처: https://www.acmicpc.net/problem/1018
풀이
규칙을 찾아서 풀어도되지만 8*8 체스판을 검정색,흰색이 각각 먼저 나오는 두 가지 버전으로 그려놓고 하나씩 비교하며 풀었습니다.
주의할점 :
1. 최소값이 매번 갱신되어야하므로 min_val 변수선언하여 비교
2. black_change,white_change도 매번 갱신되므로 전역변수가 아닌 지역변수로 선언
3. string이 아닌 c언어로 풀 때 인덱스 조심(50 X 51부터)
4. 체스판을 검색하는 함수(black,white)에서 인덱스 [i-y][j-x]가 탐색을 시작한 좌표와 그려놓은 체스판의 첫번째 요소부터 같이 움직이는것을 알기
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<iostream> #include<algorithm> using namespace std; int n, m; char map[55][55]; int min_val = 2000; const char b[8][9] = { {"BWBWBWBW"}, {"WBWBWBWB"}, {"BWBWBWBW"}, {"WBWBWBWB"}, {"BWBWBWBW"}, {"WBWBWBWB"}, {"BWBWBWBW"}, {"WBWBWBWB"} }; const char w[8][9] = { {"WBWBWBWB"}, {"BWBWBWBW"}, {"WBWBWBWB"}, {"BWBWBWBW"}, {"WBWBWBWB"}, {"BWBWBWBW"}, {"WBWBWBWB"}, {"BWBWBWBW"} }; int black(int y, int x); int white(int y, int x); int main() { cin >> n >> m; for (int i = 0; i < n; i++) cin >> map[i]; for (int i = 0; i < n - 7; i++) { for (int j = 0; j < m - 7; j++) { min_val = min(min(min_val,white(i, j)),black(i,j)); } } cout << min_val << endl; } int black(int y, int x) { int black_change = 0; for (int i = y; i < y + 8; i++) { for (int j = x; j < x + 8; j++) { if (map[i][j] != b[i-y][j-x]) black_change++; } } return black_change; } int white(int y, int x) { int white_change = 0; for (int i = y; i < y + 8; i++) { for (int j = x; j < x + 8; j++) { if (map[i][j] != w[i - y][j - x]) white_change++; } } return white_change; } | cs |
결과
'문제풀이(BOJ) > 시뮬레이션(구현)' 카테고리의 다른 글
[백준 17224] APC는 왜 서브태스크 대회가 되었을까? (3) | 2020.03.10 |
---|---|
[백준 15953] 상금 헌터 (0) | 2020.03.10 |
[백준 5533] 유니크 (0) | 2020.01.19 |
[백준 9517] 아이 러브 크로아티아 (0) | 2020.01.19 |
[백준 5567] 결혼식 (0) | 2020.01.15 |