-
[BOJ] #17070 _ 파이프 옮기기1Problem Solving/BOJ 2019. 8. 28. 21:51
[파이프 옮기기1] https://www.acmicpc.net/problem/17070
조건대로만 파이프 옮기는 것이 가능한 시뮬레이션 문제이다.
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 댓글