오일러OJ

#5000 뒤집기

杉山空 2022. 3. 1. 21:03
728x90

https://euleroj.io/problemset/viewer/5000

문제에 퇴각검색 태그가 달려있지만 신경쓰지 않아도 된다.

여기에서 각 칸의 색을 다른 칸에 영향을 주지 않고 바꾸기 위해서는 정확히 반대쪽 칸의 색을 바꾸었을 때 색이 변하는 부분의 색을 모두 바꾸어 주면 된다. (해보면 알 수 있다.)

 

원래 상태는 모두 하얀색으로 한다.

입력을 받아가면서 검은색이 있는 부분이 있다면 그 부분의 색을 바꾸었을 때 색이 바뀌는 부분과 그 부분의 색을 모두 바꾼다. 입력을 모두 받은 후 9번 칸 부터 1번칸 까지 탐색하며, 검은색이라면, 색을 바꾼다. 이때, 원래 상태에서 색을 바꾸는 경우는 여기서 색을 바꾸는 경우와 완전히 반대가 되어야 한다.

 

이대로 구현해 주면 된다.

 

코드

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
#include <bits/stdc++.h>
using namespace std;
char S[12];
int A[12][12];
int main(){
    int i,j,k,l,cnt;
    cnt=0;
    memset(A,0,sizeof(A));
    scanf("%s",S);
    for(i=1;i<=3;i++){
        for(j=1;j<=3;j++){
            if(S[(i-1)*3+j-1]=='b'){
                for(k=i-1;k<=i+1;k++){
                    for(l=j-1;l<=j+1;l++){
                        A[k][l]^=1;
                    }
                }
            }
        }
    }
    stack<int>s;
    for(i=3;i>0;i--){
        for(j=3;j>0;j--){
            if(A[i][j]){
                printf("%d",(3-i)*3+(3-j+1));
                cnt++;
            }
        }
    }
    if(cnt==0)printf("0");
    printf("\n");
    return 0;
}
 
cs
728x90