[BOJ] 15684 : 사다리 조작
풀이
시뮬레이션
그려가면서 꼼꼼히 풀었는데 한번에 맞췄다.
시뮬레이션은 쉬운것같다.
코드
#include <iostream>
#include <queue>
#include <deque>
#include <vector>
#include <cstring>
using namespace std;
int n, m, h;
//가로선 정보 저장
int arr[31][11];
int sw = 0;
bool check() {
bool flag = true;
//각 세로선에서 출발
for (int i = 1; i <= n; i++) {
int pointX = 1;
int pointY = i;
for (int j = 1; j <= h; j++) {
if (arr[pointX][pointY] == 1) {
pointY++;
}
else if (arr[pointX][pointY - 1] == 1) {
pointY--;
}
pointX++;
}
//cout << pointX <<' '<< pointY << '\n';
//pointY랑 i가 같지않으면 잘못된것
if (pointY != i) {
flag = false;
break;
}
}
return flag;
}
void go(int sx,int sy, int cnt, int sum) {
if (sw) {
return;
}
if (cnt == sum) {
//check해서 답을 찾으면 sw=1
if (check()) {
sw = 1;
}
return;
}
//조합 짜기
for (int i = sx; i <= h; i++) {
for (int j = sy; j <= n; j++) {
if (arr[i][j] == 0) {
if (j - 1 < 0 || arr[i][j - 1] == 0) {
if (j + 1 > n || arr[i][j + 1] == 0) {
arr[i][j] = 1;
go(i, j, cnt + 1, sum);
arr[i][j] = 0;
}
}
}
}
sy = 1;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//n:세로줄(y) m:가로인데 가짜가로임 h:진짜가로(x)이자 경우의 수 살필 대상
cin >> n >> m >> h;
//i번 세로선의 결과가 i번이 되어야한다.
//추가해야 하는 가로선 개수의 최솟값
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
arr[a][b]=1;
}
int ans = 0;
if (!check()) {
ans = 1;
while (ans<=3) {
go(1,1,0,ans);
if (sw)
break;
ans++;
}
}
//불가능하거나 3보다 큰값이면 -1을 출력
if (ans > 3)
ans = -1;
cout << ans;
return 0;
}
Written on April 11, 2019