[BOJ] 파이프 옮기기1
Date:
[BOJ] 파이프 옮기기1
Problem URL : 파이프 옮기기1
#include <iostream>
#include <algorithm>
using namespace std;
int N;
int map[17][17];
int ans;
int dx[3] = { 0, 1, 1 };
int dy[3] = { 1, 1, 0 };
struct pipe {
int x, y, dir;
pipe(int _x, int _y, int _dir) : x(_x), y(_y), dir(_dir) {};
};
bool movable(int x, int y, int dir) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx <= N && ny <= N && map[nx][ny] == 0) {
if (dir == 1) { // 대각선 방향일 때는 우상,좌하 모서리를 추가로 체크
if (map[x][ny] == 0 && map[nx][y] == 0) {
return true;
} else {
return false;
}
} else {
return true;
}
}
return false;
}
void dfs(pipe now) {
int x = now.x;
int y = now.y;
int dir = now.dir;
if (x == N && y == N) {
ans++;
return;
}
for (int turn = -1; turn <= 1; turn++) {
int newDir = turn + dir;
if (newDir >= 0 && newDir <= 2) {
if (movable(x, y, newDir)) {
pipe next(x + dx[newDir], y + dy[newDir], newDir);
dfs(next);
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> map[i][j];
}
}
pipe cur(1,2,0);
dfs(cur);
cout << ans << "\n";
return 0;
}
Comments
코드를 깔끔하게 짜기가 힘들었던 문제 자잘한 실수가 많았다. (x,y 방향 헷갈리지 말자!)
댓글