음... 테트리스의 모양 중에서 다른건 간단하게 생각하셨을 것 같은데...
凸이 모양이 좀 고민스러웠죠...
저는
위, 아래, 왼, 오른쪽으로 각각 가중치를 주었습니다. dfs 매개변수에서 weight라는 변수입니다.
위 = 1
아래 = 10
왼 = 100
오 = 1000
이렇게 각각 주어서
만약 세로로 세칸 짜리는 20이 될 것입니다.(0부터 시작하므로 2칸이동하면 20)
만약 가로로 세칸 짜리는 2000이 될 것입니다. 오른쪽으로 두 칸 갔기 때문입니다.
이 두가지 경우에는 추가로 2방향씩 더 검사해줍니다.
세로 방향일 경우에는 1시와 11시 대각선을 검사하고, (코드에서 (ddx[0], ddy[0]), (ddx[1], ddy[1]))
가로 방향일 경우에는 11시와 7시 방향의 대각선을 검사하면 됩니다. (코드에서 (ddx[2], ddy[2]), (ddx[3], ddy[3]))
모든 맵을 dfs하고 가장 큰 수를 출력하면 끝입니다.!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <string.h> #include <vector> #include <functional> #define MAX_SIZE 500 #define INF 0x7fffffff using namespace std; //input int map[MAX_SIZE][MAX_SIZE]; int m, n; //process bool visit[MAX_SIZE][MAX_SIZE]; int max_value; int dx[4] = { -1, 1, 0, 0 }; int dy[4] = { 0, 0, -1, 1 }; int ddx[4] = { -1, -1, -1, 1 }; int ddy[4] = { -1, 1, -1, -1 }; void input(){ scanf("%d %d", &m, &n); for (int i = 0; i < m; i++){ for (int j = 0; j < n; j++){ scanf("%d", &map[i][j]); } } } int pow(int n, int r){ if (r == 0) return 1; else if (r % 2 == 0){ int tmp = pow(n, r / 2); return tmp *tmp; } else return pow(n, r - 1) * n; } void dfs(int x, int y, int d, int sum, int weight){ if (d == 3){ max_value = max(max_value, sum); return; } for (int i = 0; i < 4; i++){ int nx = x + dx[i]; int ny = y + dy[i]; if (nx < 0 || ny < 0 || nx >= m || ny >= n || visit[nx][ny]) continue; visit[x][y] = 1; dfs(nx, ny, d + 1, sum + map[nx][ny], weight + pow(10, i)); visit[x][y] = 0; } if (weight == 20){ for (int i = 0; i < 2; i++){ int nx = x + ddx[i]; int ny = y + ddy[i]; if (nx < 0 || ny < 0 || nx >= m || ny >= n || visit[nx][ny]) continue; dfs(nx, ny, d + 1, sum + map[nx][ny], weight); } } else if (weight == 2000){ for (int i = 2; i < 4; i++){ int nx = x + ddx[i]; int ny = y + ddy[i]; if (nx < 0 || ny < 0 || nx >= m || ny >= n || visit[nx][ny]) continue; dfs(nx, ny, d + 1, sum + map[nx][ny], weight); } } } void process(){ for (int i = 0; i < m; i++){ for (int j = 0; j < n; j++){ dfs(i, j, 0, map[i][j], 0); } } printf("%d\n", max_value); } int main(){ input(); process(); return 0; } | cs |
'알고리즘 > 탐색' 카테고리의 다른 글
[14502] 연구소 (5) | 2017.04.18 |
---|---|
[14501] 퇴사 (4) | 2017.04.17 |
[3055] 탈출 (0) | 2017.04.16 |
[5427] 불 (0) | 2017.04.16 |
[13460] 째로탈출2 (2) | 2017.04.16 |