-
백준 17069번 파이프 옮기기2PS 2020. 3. 22. 22:53
https://www.acmicpc.net/problem/17069
17069번: 파이프 옮기기 2
유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 번호이고, 행과 열의 번호는 1부터 시작한다. 각각의 칸은 빈 칸이거나 벽이다. 오늘은 집 수리를 위해서 파이프 하나를 옮기려고 한다. 파이프는 아래와 같은 형태이고, 2개의 연속된 칸을 차지하는 크기이다. 파이프는 회전시킬 수 있으며, 아래와 같이
www.acmicpc.net
<접근방법>
완전탐색으로 할 경우 시간초과가 납니다.
dp로 중복탐색을 없애야 합니다.
<느낀 점>
<코드>
#include <iostream> #include <algorithm> #include <memory.h> using namespace std; int n, map[33][33]; long long cache[33][33][3]; int dy[3] = {0, 1, 1}; int dx[3] = {1, 0, 1}; long long dfs(int y, int x, int d) { //기저사례 if (y == n - 1 && x == n - 1) return 1; //중복방문 long long &res = cache[y][x][d]; if (res != -1) return res; res = 0; for (int i = 0; i < 3; i++) { if (d == 0 && i == 1) continue; if (d == 1 && i == 0) continue; int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 | ny >= n | nx < 0 | nx >= n | map[ny][nx] == 1) continue; if (i == 2 && (map[y + 1][x] == 1 || map[y][x + 1] == 1)) continue; res += dfs(ny, nx, i); } return res; } int main() { memset(cache, -1, sizeof(cache)); cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; } } cout << dfs(0, 1, 0) << '\n'; return 0; }
반응형'PS' 카테고리의 다른 글
백준 16957번 체스판 위의 공 (0) 2020.03.24 백준 5014번 스타트링크 (0) 2020.03.24 백준 16931번 겉넓이 구하기 (1) 2020.03.21 백준 16974번 레벨 햄버거 (0) 2020.03.19 백준 16948번 데스 나이트 (0) 2020.03.19