-
[백준][15684번] 사다리 조작Algorithm/백준 2020. 4. 27. 22:15
https://www.acmicpc.net/problem/15684
15684번: 사다리 조작
사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선이 같은 위치를 갖는다. 아래 그림은 N = 5, H = 6 인 경우의 그림이고, 가로선은 없다. 초록선은 세로선을 나타내고, 초록선과 점선이 교차하는 점은 가로선을 놓을 수 있는 점이다. 가로선은 인접한 두 세로선을 연결해야 한다. 단, 두 가로선이 연속하거나 서로
www.acmicpc.net
풀이과정
1. 사다리를 조작해 시작과 끝점이 같도록 만드는 문제이다. 1에서 시작해서 1로 끝나면 된다.
2. 최대 3개의 사다리를 추가할 수 있어 시작 answer = 4로 정했다.
3. solution함수에 다음 시작점인 x, y를 추가하지 않아, 시간 초과가 발생했다.
4. map[y][x]가 1이라면 x + 1 지점과 연결되었다는 생각으로 문제를 풀었다.
반대로 map[y][x]가 0이지만 , map[y][x-1]이 1이라면 연결되어 있다.
소스코드 (완전탐색, c++)
더보기#include <stdio.h> int map[30][10]; int N, M, H; int answer = 4; int lineMove(int num) { int x = num, y = 0; while (1) { if (y >= H) { return num == x; } if (map[y][x] == 1) { x++; y++; } else { if (x - 1 >= 0 && map[y][x - 1] == 1) { x--; y++; } else { y++; } } } } bool lineCheck() { for (int i = 0; i < N; i++) { if (!lineMove(i)) { return false; } } return true; } void solution(int depth, int x, int y) { if (depth > 3 || answer <= depth) return; if (lineCheck()) { if (answer > depth) { answer = depth; } return; } for (int i = y; i < H; i++) { for (int j = x; j < N - 1; j++) { if (map[i][j] == 1) continue; int prevX = j - 1; int nextX = j + 1; if (prevX >= 0 && map[i][prevX] != 0) continue; if (nextX < N && map[i][nextX] != 0) continue; map[i][j] = 1; solution(depth+1, j+1, i); map[i][j] = 0; } x = 0; } } int main() { scanf("%d %d %d", &N, &M, &H); for (int i = 0; i < M; i++) { int x, y; scanf("%d %d", &y, &x); map[y-1][x-1] = 1; } if (M == 0) { printf("0\n"); } else { solution(0, 0 ,0); printf("%d\n", answer == 4 ? -1 : answer); } }
결과
'Algorithm > 백준' 카테고리의 다른 글
[백준][15686번] 치킨 배달 (0) 2020.04.30 [백준][15685번] 드래곤 커브 (0) 2020.04.28 [백준][15683번] 감시 (0) 2020.04.26 [백준][14891번] 톱니바퀴 (0) 2020.04.26 [백준][14890번] 경사로 (0) 2020.04.25