15684 사다리 조작
문제 링크
#include <bits/stdc++.h>
using namespace std;
int n, m, h;
vector<vector<int>> ladder;
void print_ladder() {
cout << "print_ladder\n";
for (int r = 1; r <= h; r++) {
for (int c = 1; c <= n; c++) {
if (ladder[r][c] == 1)
cout << "├";
else if (ladder[r][c] == -1)
cout << "┤";
else
cout << "│";
}
cout << "\n";
}
cout << "\n";
}
int run_simul() {
print_ladder();
for (int c = 1; c <= n; c++) {
int tC = c;
for (int r = 1; r <= h; r++)
tC += ladder[r][tC];
if (tC != c)
return false;
}
cout << "SUCCESS\n";
return true;
}
int dfs(int cnt, int row, int col) {
if (!cnt) {
return run_simul();
}
int ret = 0;
for (int r = row; r <= h; r++) {
for (int c = col; c < n; c++) {
if (!(ladder[r][c] || ladder[r][c + 1])) {
ladder[r][c] = 1;
ladder[r][c + 1] = -1;
ret = dfs(cnt - 1, r, c);
if (ret)
return ret;
ladder[r][c] = 0;
ladder[r][c + 1] = 0;
}
}
}
return ret;
}
int solve() {
for (int cnt = 0; cnt <= m; cnt++) {
cout << "cnt : " << cnt << "\n";
if (dfs(cnt, 1, 1))
return cnt;
}
return -1;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int a, b;
cin >> n >> m >> h;
ladder.resize(h + 1, vector<int>(n + 1, 0));
for (int i = 0; i < m; i++) {
cin >> a >> b;
ladder[a][b] = 1;
ladder[a][b + 1] = -1;
}
cout << solve() << "\n";
}
dfs 시작점을 어떻게 해야 중복된 순회를 하지 않을까
3항 연산자!
댓글남기기