본문 바로가기

개발/알고리즘

백준 17070 파이프옮기기1 C++

문제

www.acmicpc.net/problem/17070

 

17070번: 파이프 옮기기 1

유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의

www.acmicpc.net

코드

#include <bits/stdc++.h>

using namespace std;

int n, a[20][20], dp[20][20][3];
int dy[3] = { 0, 1, 1 }, dx[3] = { 1, 0, 1 };

int go(int y, int x, int dir)
{
	if (y == n - 1 && x == n - 1)
		return dp[y][x][dir] = 1;

	int& ans = dp[y][x][dir];
	if (ans != -1)
		return ans;

	ans = 0;
	for (int i = 0; i < 3; i++)
	{
		//45도 회전만 가능함
		//가로->세로 || 세로->가로 불가능
		if ((i == 0 && dir == 1) || (i == 1 && dir == 0))
			continue;

		//대각선인 경우 
		if (i == 2 && (a[y][x + 1] || a[y + 1][x]))
			continue;

		int ny = y + dy[i];
		int nx = x + dx[i];
		if (ny < 0 || ny >= n || nx < 0 || nx >= n || a[ny][nx])
			continue;

		ans += go(ny, nx, i);
	}
	return ans;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> a[i][j];
		}
	}
	memset(dp, -1, sizeof(dp));
	
	cout << go(0,1,0) << "\n";

	return 0;
}

'개발 > 알고리즘' 카테고리의 다른 글

백준 1987 알파벳 C++  (0) 2021.05.03
백준 17298 오큰수 C++ (Stack)  (0) 2021.05.03
백준 1647 도시 분할 계획 C++  (0) 2021.04.17
백준 1344 축구 C++  (0) 2021.04.16
백준 4781번 사탕가게 C++  (0) 2021.04.16