336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
좌상우하 로 2048 판이 주어졌을 때
좌상우하 5번을 이동했을 때 이때 2048 판의 최대 값이 무엇인지를 구하는 문제였다.
DFS로 코드를 작성하였고,
DFS(select , trial , board);
select 에 따라 좌/상/우/하 중 하나로 움직이게 하는 것이고,
trial 은 시도 횟수이다.
board는 copy를 해서 인자로 넘겨줘야한다.
그냥 이렇게 하면 되겠지하고 코드를 한번 엎었다.
변수명 헷갈리게 작성해서 잘못된 부분 찾는데 애먹었다.
그래서 코드를 엎고나서, 변수명을 확실하게 적어줬다.
코드도 4000B 로 엄청 긴데
어떻게 줄여야 할지 ..,
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | #include<cstdio> #define MAX 22 #define TRY 5 using namespace std; typedef long long LLD; LLD imap[MAX][MAX]; int n; LLD maxLL(LLD a, LLD b) { return a > b ? a : b; } void print_map(LLD p[][MAX]) { //system("cls"); for (int r = 0; r < n; r++) { for (int c = 0; c < n; c++) { printf("%4lld ", p[r][c]); } puts(""); } } LLD dfs(int select, int trial, LLD m[][MAX]) { LLD ret = -1; switch (select) { case 1: // 위로 , 열은 그대로 row를 올림 for(int c = 0 ; c < n ; c++){ for (int r = 0; r < n - 1; r++) { if (m[r][c] == 0) { for (int shift_row = r + 1; shift_row < n; shift_row++) { if (m[shift_row][c] != 0) { m[r][c] = m[shift_row][c]; m[shift_row][c] = 0; break; } } } } // 0의 자리를 채워주기 위함 for (int r = 0; r < n - 1; r++) { if (m[r][c] != 0 && m[r][c] == m[r+1][c]) { m[r][c] *= 2; m[r + 1][c] = 0; } } // 각 칸 sum end for (int r = 0; r < n - 1; r++) { if (m[r][c] == 0) { for(int shift_row = r+1 ; shift_row < n ; shift_row++){ if (m[shift_row][c] != 0) { m[r][c] = m[shift_row][c]; m[shift_row][c] = 0; break; } } } } // 0의 자리를 채워주기 위함 } break; case 2: // 아래로 , 열은 그대로 row를 내림 for (int c = 0; c < n; c++) { for (int r = n - 1; r > 0; r--) { if (m[r][c] == 0) { for (int shift_row = r - 1; shift_row >= 0; shift_row--) { if (m[shift_row][c] != 0) { m[r][c] = m[shift_row][c]; m[shift_row][c] = 0; break; } } } } // 0의 자리를 채워주기 위함 for (int r = n - 1; r > 0; r--) { if (m[r][c] != 0 && m[r][c] == m[r - 1][c]) { m[r][c] *= 2; m[r - 1][c] = 0; } } // 각 칸 sum end for (int r = n - 1; r > 0; r--) { if (m[r][c] == 0) { for (int shift_row = r - 1; shift_row >= 0; shift_row--) { if (m[shift_row][c] != 0) { m[r][c] = m[shift_row][c]; m[shift_row][c] = 0; break; } } } } // 0의 자리를 채워주기 위함 } break; case 3: // 좌로 , 행은 그대로 col를 내림 for (int r = 0; r < n; r++) { for (int c = 0; c < n - 1; c++) { if (m[r][c] == 0) { for (int shift_col = c + 1; shift_col < n; shift_col++) { if (m[r][shift_col] != 0) { m[r][c] = m[r][shift_col]; m[r][shift_col] = 0; break; } } } } for (int c = 0; c < n - 1; c++) { if (m[r][c] != 0 && m[r][c] == m[r][c + 1]) { m[r][c] *= 2; m[r][c + 1] = 0; } } for (int c = 0; c < n - 1; c++) { if (m[r][c] == 0) { for (int shift_col = c + 1; shift_col < n; shift_col++) { if (m[r][shift_col] != 0) { m[r][c] = m[r][shift_col]; m[r][shift_col] = 0; break; } } } } } break; case 4: // 우로 , 행은 그대로 col을 올림 for (int r = 0; r < n; r++) { for (int c = n - 1; c > 0; c--) { if (m[r][c] == 0) { for (int shift_col = c - 1; shift_col >= 0; shift_col--) { if (m[r][shift_col] != 0) { m[r][c] = m[r][shift_col]; m[r][shift_col] = 0; break; } } } } for (int c = n - 1 ; c > 0; c--) { if (m[r][c] != 0 && m[r][c] == m[r][c - 1]) { m[r][c] *= 2; m[r][c - 1] = 0; } } for (int c = n - 1; c > 0 ; c--) { if (m[r][c] == 0) { for (int shift_col = c - 1; shift_col >= 0; shift_col--) { if (m[r][shift_col] != 0) { m[r][c] = m[r][shift_col]; m[r][shift_col] = 0; break; } } } } } break; } if (trial == TRY) { for (int r = 0; r < n; r++) for (int c = 0; c < n; c++) ret = maxLL(ret, m[r][c]); return ret; } for (int i = 1; i < 5; i++) { LLD copy[MAX][MAX]; for (int r = 0; r < n; r++) for (int c = 0; c < n; c++) copy[r][c] = m[r][c]; ret = maxLL(ret,dfs(i, trial + 1, copy)); } return ret; } int main() { scanf("%d", &n); for (int r = 0; r < n; r++) for (int c = 0; c < n; c++) scanf("%lld", &imap[r][c]); printf("%lld",dfs(0, 0, imap)); return 0; } | cs |
'PSNote > Problem Solving' 카테고리의 다른 글
[BOJ-13301]타일장식물 (0) | 2017.07.17 |
---|---|
[ALGOSPOT]DARPA (0) | 2017.07.17 |
[BOJ-11657]타임머신 (0) | 2017.07.17 |
[BOJ-2178]미로찾기 (0) | 2017.07.17 |
[BOJ-2580]스도쿠 (0) | 2017.07.17 |