본문 바로가기
CS/알고리즘

백준 17070 파이프 옮기기1

by zieunee 2020. 10. 3.
반응형

www.acmicpc.net/problem/17070

 

17070번: 파이프 옮기기 1

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

www.acmicpc.net

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

int N;
int map[20][20];
int ax, ay, bx, by;
int cache[20][20][4];


int solve(int sx, int sy, int status) {
	if (sx == N && sy == N) return 1;
	int &ret = cache[sx][sy][status];
	if (ret != -1) return ret;
	ret = 0;
	switch (status) {
	case 1://가로일때
		//가로
		if (sy + 1 <= N && !map[sx][sy+1]) {
			ret += solve(sx, sy + 1, 1);
		}
		//대각선
		if (sx+1 <= N && sy + 1 <= N && !map[sx + 1][sy + 1] && !map[sx][sy + 1] && !map[sx + 1][sy]) {
			ret += solve(sx + 1, sy + 1, 3);
		}
		break;
	case 2://세로
		//세로
		if (sx + 1 <= N && !map[sx + 1][sy]) {
			ret += solve(sx+1, sy, 2);
		}
		//대각선
		if (sx + 1 <= N && sy + 1 <= N && !map[sx + 1][sy + 1] && !map[sx][sy + 1] && !map[sx + 1][sy]) {
			ret += solve(sx + 1, sy + 1, 3);
		}
		break;
	case 3://대각선
		//가로
		if (sy + 1 <= N && !map[sx][sy + 1]) {
			ret += solve(sx, sy + 1, 1);
		}
		//세로
		if (sx + 1 <= N && !map[sx+1][sy]) {
			ret += solve(sx+1, sy, 2);
		}
		//대각선
		if (sx + 1 <= N && sy + 1 <= N && !map[sx + 1][sy + 1] && !map[sx][sy + 1] && !map[sx + 1][sy]) {
			ret += solve(sx + 1, sy + 1, 3);
		}
		break;
	}
	return ret;
}
int main() {
	memset(cache, -1, sizeof(cache));
	scanf("%d", &N);
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			scanf("%d", &map[i][j]);
		}
	}

	printf("%d", solve(1, 2, 1));
	return 0;
}
반응형

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

백준 17135 캐슬 디펜스  (0) 2020.10.05
백준 19236 청소년상어(dfs)  (0) 2020.10.04
백준 19238 스타트 택시(우선순위큐)  (0) 2020.10.02
백준 16235 나무 재테크(시뮬)  (0) 2020.05.12
백준 1063 킹(시뮬)_String  (0) 2020.05.06