반응형
#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 |