[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 방향 헷갈리지 말자!)

댓글