[BOJ] 15684 : 사다리 조작

15684 : 사다리 조작

풀이

시뮬레이션

그려가면서 꼼꼼히 풀었는데 한번에 맞췄다.

시뮬레이션은 쉬운것같다.

코드

#include <iostream>
#include <queue>
#include <deque>
#include <vector>
#include <cstring>
using namespace std;

int n, m, h;
//가로선 정보 저장
int arr[31][11];
int sw = 0;

bool check() {
    bool flag = true;
    //각 세로선에서 출발
    for (int i = 1; i <= n; i++) {
        int pointX = 1;
        int pointY = i;
        for (int j = 1; j <= h; j++) {
            if (arr[pointX][pointY] == 1) {
                pointY++;
            }
            else if (arr[pointX][pointY - 1] == 1) {
                pointY--;
            }
            pointX++;
        }
        //cout << pointX <<' '<< pointY << '\n';
        //pointY랑 i가 같지않으면 잘못된것
        if (pointY != i) {
            flag = false;
            break;
        }
    }
    return flag;
}

void go(int sx,int sy, int cnt, int sum) {
    if (sw) {
        return;
    }

    if (cnt == sum) {
        //check해서 답을 찾으면 sw=1
        if (check()) {
            sw = 1;
        }
        return;
    }

    //조합 짜기
    for (int i = sx; i <= h; i++) {
        for (int j = sy; j <= n; j++) {
            if (arr[i][j] == 0) {
                if (j - 1 < 0 || arr[i][j - 1] == 0) {
                    if (j + 1 > n || arr[i][j + 1] == 0) {
                        arr[i][j] = 1;
                        go(i, j, cnt + 1, sum);
                        arr[i][j] = 0;
                    }
                }
            }
        }
        sy = 1;
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    //n:세로줄(y) m:가로인데 가짜가로임 h:진짜가로(x)이자 경우의 수 살필 대상
    cin >> n >> m >> h;
    //i번 세로선의 결과가 i번이 되어야한다.
    //추가해야 하는 가로선 개수의 최솟값
    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        arr[a][b]=1;
    }
    
    int ans = 0;
    if (!check()) {
        ans = 1;
        while (ans<=3) {
            go(1,1,0,ans);
            if (sw)
                break;
            ans++;
        }
    }
    //불가능하거나 3보다 큰값이면 -1을 출력
    if (ans > 3)
        ans = -1;
    cout << ans;
    return 0;
}
Written on April 11, 2019