-
[BOJ] #17070 _ 파이프 옮기기1Problem Solving/BOJ 2019. 8. 28. 21:51
[파이프 옮기기1] https://www.acmicpc.net/problem/17070
17070번: 파이프 옮기기 1
유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 번호이고, 행과 열의 번호는 1부터 시작한다. 각각의 칸은 빈 칸이거나 벽이다. 오늘은 집 수리를 위해서 파이프 하나를 옮기려고 한다. 파이프는 아래와 같은 형태이고, 2개의 연속된 칸을 차지하는 크기이다. 파이프는 회전시킬 수 있으며, 아래와 같이
www.acmicpc.net
조건대로만 파이프 옮기는 것이 가능한 시뮬레이션 문제이다.
dfs를 이용하여 가능한 모든 경우를 찾는 방식으로 구현하였다.
[ 소스 코드 ]
#include <cstdio> #include <algorithm> #define MAX 17 using namespace std; int dx[] = { 1,0,1 }, dy[] = { 0,1,1 }; int N, result; int map[MAX][MAX]; void solve(int pipe, int y, int x); int main() { scanf("%d", &N); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { scanf("%d", &map[i][j]); } } map[1][1] = 1; map[1][2] = 1; solve(0, 1, 2); printf("%d\n", result); return 0; } void solve(int pipe, int y, int x) { if (pipe == 0 || pipe == 2) { //가로 int tmp_y = y + dy[0], tmp_x = x + dx[0]; if (tmp_y <= N && tmp_x <= N) { if (!map[tmp_y][tmp_x]) { if (tmp_y == N && tmp_x == N) result++; else { map[tmp_y][tmp_x] = 1; solve(0, tmp_y, tmp_x); map[tmp_y][tmp_x] = 0; } } } } if (pipe == 1 || pipe == 2) { //세로 int tmp_y = y + dy[1], tmp_x = x + dx[1]; if (tmp_y <= N && tmp_x <= N) { if (!map[tmp_y][tmp_x]) { if (tmp_y == N && tmp_x == N) result++; else { map[tmp_y][tmp_x] = 1; solve(1, tmp_y, tmp_x); map[tmp_y][tmp_x] = 0; } } } } int tmp_y = y + dy[2], tmp_x = x + dx[2]; //대각선 if (tmp_y <= N && tmp_x <= N) { if (!map[tmp_y][tmp_x] && !map[y][tmp_x] && !map[tmp_y][x]) { if (tmp_y == N && tmp_x == N) result++; else { map[tmp_y][x] = 1; map[y][tmp_x] = 1; map[tmp_y][tmp_x] = 1; solve(2, tmp_y, tmp_x); map[tmp_y][x] = 0; map[y][tmp_x] = 0; map[tmp_y][tmp_x] = 0; } } } }
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] #5373 _ 큐빙 (0) 2019.10.20 [BOJ] #1976 _ 여행 가자 (0) 2019.10.20 [BOJ] #14891 _ 톱니바퀴 (0) 2019.08.28 [BOJ] #14888 _ 연산자 끼워넣기 (0) 2019.08.28 [BOJ] #14503 _ 로봇 청소기 (0) 2019.08.28 댓글