문제풀이/백준oj

[백준OJ] 15684번 사다리 조작

Hyeon-Uk 2021. 8. 26. 22:58
반응형

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

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선

www.acmicpc.net


 

 

풀이

maze[i][j]=k 라고 한다면, j번 가로선에서, i와i+1사이에 선이 있다면 k=1, 없다면 k=0으로 설정을 해준다.

백트래킹을 이용해서 가로선이 놓여있지 않은곳에 최대 3개의 가로선을 놔두면서, 각 경우마다 i번째 세로선의 결과가 i가 나오는지 체크를 해주며 최솟값을 갱신해주면된다.

 

이때 가로선이 없다는 의미는 b와 b+1사이에 가로선이 없어야 함과 동시에, b-1과b사이에 가로선또한 없어야 하므로 조건에 추가해주는것을 유의해야한다.

 

코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int maze[11][31]={0};
int n,m,h;
int result=4;


//i번 세로선의 결과가 i번인지 확인
bool check(){
    for(int i=1;i<=n;i++){
        int now=i;
        int goal=i;
        
        for(int j=1;j<=h;j++){
            if(maze[now][j]==1){
                now++;
            }
            else if(maze[now-1][j]==1){
                now--;
            }
        }
        
        if(now!=goal){
            return false;
        }
    }
    return true;
}

void dfs(int line,int cnt){
    //3개이상이면 어차피 불가능과 같은 출력이므로 return
    if(cnt>3){
        return;
    }
    //결과가 맞으면 result갱신
    if(check()){
        result=min(result,cnt);
    }
    
	
    for(int j=line;j<=h;j++){
        for(int i=1;i<n;i++){
        	//해당 가로선이 없으면 백트래킹
            if(maze[i][j]==0&&maze[i-1][j]==0){
                maze[i][j]=1;
                dfs(j,cnt+1);
                maze[i][j]=0;
            }
        }
    }
}

int main() {
    cin>>n>>m>>h;
    
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        maze[b][a]=1;//a번 가로선에 b와b+1사이에 가로선이 있다.
    }
    dfs(1,0);
    cout<<(result==4?-1:result);
  
	return 0;
}
반응형