본문 바로가기
algorithm/ACMICPC

사다리 조작 - 15684

by 에어컨조아 2019. 12. 8.

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

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선이 같은 위치를 갖는다. 아래 그림은 N = 5, H = 6 인 경우의 그림이고, 가로선은 없다. 초록선은 세로선을 나타내고, 초록선과 점선이 교차하는 점은 가로선을 놓을 수 있는 점이다. 가로선은 인접한 두 세로선을 연결해야 한다. 단, 두 가로선이 연속하거나 서로

www.acmicpc.net

코드 :

#include <iostream>
#include <limits>
using namespace std;

bool num[31][11] = { false };
int value = INT32_MAX;
int m, n, h = 0;

bool Check()
{
	for (int y = 1; y <= n; y++)
	{
		int temp = y;
		for (int x = 1; x <= h; x++)
		{
			if (num[x][temp]) temp += 1;
			else if (num[x][temp - 1]) temp -= 1;
		}

		if (temp != y)
			return false;
	}
	return true;
}

void solution(int x, int y, int count)
{
	//탈출조건
	if (count > 3)
	{
		return;
	}
	if (Check()) // 성공조건
	{
		if (value > count)
		{
			value = count;
		}
		return;
	}
	if (count == 3)
	{
		return;
	}

	//다음경우
	for (int i = x; i <= h; i++, y =1)
	{
		for (int j = y; j < n; j++)
		{
			if (num[i][j])
			{
				j++;
				continue;
			}
			num[i][j] = true;
			solution(i, j + 2, count + 1);
			num[i][j] = false;
		}
	}

}

int main()
{
	cin >> n >> m >> h;

	int x, y;
	for (int i = 0; i < m; i++)
	{
		cin >> x >> y;
		num[x][y] = true;
	}

	solution(1, 1, 0);
	if (value != INT32_MAX)
	{
		cout << value << "\n";
	}
	else
	{
		cout << -1 << "\n";
	}
	return 0;
}

이해하는데 상당히 오래걸린 문제.. 

주의사항 :

1. 인접으로 주어지는 가로선이 서로 연속할 수 없다는 것을 잊지말아야 한다.

2. 다음경우 구할때 y =1 을 해줘야 다음 가로선에서 처음부터 탐색을 한다. 

음.... 이 문제를 풀면서 재귀함수에도 두가지 패턴이 존재하는 것 같다. 

1. 재귀함수 안에 루프를 사용하여 완탐을 하는방법

2. 재귀함수만 사용하여 완탐을 하는 방법

 

'algorithm > ACMICPC' 카테고리의 다른 글

N-Queen - 9663  (0) 2019.12.23
테트로미노 - 14500 (Solve 2)  (0) 2019.12.14
퇴사 - 14501  (0) 2019.12.03
부분수열의 합 - 1182  (0) 2019.12.03
암호 만들기 -1759  (0) 2019.12.03

댓글