티스토리 뷰

알고리즘/백준

백준 / 15684 사다리 조작 C++

4567은 소수 2021. 2. 1. 03:24

www.acmicpc.net/problem/15684

 

15684번: 사다리 조작

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

www.acmicpc.net

사다리가 주어져있을 때 최소 몇 개를 더 놓아야 모든 선들이 출발점과 도착점이 같을까 하는 문제입니다.

선이 새로 놓일 수 있는 경우가 최대 270가지이고 모든 경우를 다 따졌을 때는 대충 계산해보면 시간 초과의 느낌이 납니다. 

하지만, 선이 놓여져있을 때 좌, 우에 선이 놓일 수 없는 것을 이용하면 해볼만 하다 생각하여 그냥 가능한 모든 선을 다 깔았습니다.

 

코드는 다음과 같습니다.

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

using namespace std;

int n, m, h;
bool check[11][30]; // n번째 세로 줄 h번째 선이 오른쪽으로 연결되었는지 판단
int result = 987654321;

void make_ladder()
{
	cin >> n >> m >> h;
	memset(check, false, sizeof(check));
	while (m--) {
		int a, b;
		cin >> a >> b;
		check[b][a] = true;
	}
}

bool game()
{
	// 전부 다 자기 자신 : true
	// 아니면 false

	bool res = false;

	for (int i = 1; i <= n; i++) {
		int line = i;

		for (int j = 1; j <= h; j++) {
			if (check[line][j]) {
				line++;
			}
			else {
				if (check[line - 1][j])
					line--;
				else
					continue;
			}
		}

		if (line != i) {
			res = false;
			return res;
		}
		else
			res = true;
	}

	return res;
}

// 백트래킹
void backtracking(int idx, int cnt)
{
	if (cnt > 3)
		return;

	if (game()) {
		result = min(result, cnt);
		return;
	}

	for (int i = idx; i <= h; i++) {
		for (int j = 1; j < n; j++) {
			// 한 줄에 만드는 것 불가 
			if (check[j][i])
				continue;
			if (check[j + 1][i])
				continue;
			if (check[j - 1][i])
				continue;

			check[j][i] = true;
			backtracking(i, cnt + 1);
			check[j][i] = false;
		}
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	make_ladder();
	backtracking(1, 0);
	if (result == 987654321)
		cout << -1;
	else
		cout << result;
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 / 6588 골드바흐 추측  (0) 2021.02.02
백준 / 11657 타임머신 C++  (0) 2021.02.02
백준 / 10757 큰수 A+B C++  (0) 2021.01.29
백준 / 1516 게임 개발 C++  (0) 2021.01.28
백준 / 2470 두 용액 C++  (0) 2021.01.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
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
글 보관함