슈뢰딩거의 고등어

[BOJ] 15684 사다리타기 (c++) 본문

알고리즘

[BOJ] 15684 사다리타기 (c++)

슈뢰딩거의 고등어 2022. 1. 9. 01:03

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

 

15684번: 사다리 조작

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

www.acmicpc.net

 

 

#include <iostream>
using namespace std;

// DFS
int n, m, h;
int map[32][12];
int res = 987654321;

bool draw() {
	
	for(int x=1; x<=n; x++) {
		int cur_x = x;
		for(int y=1; y<=h; y++) {
			if(map[y][cur_x] == 1) cur_x++;
			
			else if(map[y][cur_x-1] == 1) cur_x--;
		}
		if(cur_x != x)
			return false;
	}

	return true;
}


void DFS(int y, int x, int dep) {
	if(res <= dep) return; // 가지치기

	if(draw()) {
		res = dep;
		return;
	}
    if(dep == 3) return;

	for(int cy=y; cy<=h; cy++) {
		for(int cx =x; cx<=n; cx++) {
        	// 가로선은 인접하면 안됨
			if(map[cy][cx] != 0 || map[cy][cx-1] != 0 || map[cy][cx+1] != 0) continue;
			map[cy][cx] = 1;
			DFS(cy, cx, dep+1);
			map[cy][cx] = 0;
			
		}
		x = 1;
	}
}



int main() {
	scanf("%d %d %d", &n, &m, &h);

	for(int i=0; i<m; i++) {
		int a, b;
		scanf("%d %d",&a, &b);
		map[a][b] = 1;
	}
	
	DFS(1, 1, 0);

    if(res > 3)
        printf("-1\n");
    else
	   printf("%d\n", res);

	return 0;

}

DFS 로 깊이가 3 이하인 경우들을 확인한다.

Comments