카테고리 없음
2048 쉬운 버전의 문제
벤치마킹
2018. 2. 4. 16:49
2048 문제를 풀일이 있어서 좀 수정된 (쉬운 버전의 문제를 풀어 보았다..)
단순한 자료 구조 (배열정리) 문제에 대한 해답을 정확히 찾지 못해 .. 고생하였다.
아래와 같은 문제인데.. up/down/right/left 의 순의로 같은 값을 더해 나가는것인데
방향에 따라 같은 값이 배열 옆으로 있으면 두배 해주고 0으로 만들어 주고 2칸 뛰어 넘고
만약 다음 자리에 0이면 j 값을 index 사용해서 값을 이동하고 다시 0으로 만들어준다
#include#include using namespace std; #define MAX 10001 int N; bool visit[21][21]; int board[21][21]; int queue[21]; char dir[10]; int d; /* typedef enum { RIGHT = 0, LEFT, UP, DOWN }Dir; */ enum { RIGHT = 0, LEFT, UP, DOWN }; int c_d(char a){ int ret; switch (a){ case 'r': ret = RIGHT; break; case 'l': ret = LEFT; break; case 'u': ret = UP; break; case 'd': ret = DOWN; break; default: break; } return ret; } void zero_padding(int start){ for (int i = start; i < N; i++) queue[i] = 0; } void queueing(void){ int i, j; j = 0; for (i = 0; i < N; i++) { if (queue[i] == 0) continue; else queue[j++] = queue[i]; } //j 부터 모두 zero setting zero_padding(j); j = 0; for (i = 0; i < N; i++){ if (queue[i] == 0) continue; if (queue[i] == queue[i + 1]) { queue[j] = queue[i] * 2; queue[i+1] = 0; i++, j++; } else { queue[j] = queue[i]; if (i != j) queue[i] = 0; j++; } } zero_padding(j); } void print_result() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) cout << board[i][j] << " "; cout << endl; } } void solve(void){ int i, j, k; int d_ret = c_d(dir[0]); if (d_ret == LEFT){ for (i = 0; i < N; i++){ k = 0; for (j = 0; j < N; j++) queue[k++] = board[i][j]; queueing(); k = 0; for (j = 0; j < N; j++) board[i][j] = queue[k++]; } } else if (d_ret == RIGHT){ for (i = 0; i < N; i++){ k = 0; for (j = N - 1; j >= 0; j--) queue[k++] = board[i][j]; queueing(); k = 0; for (j = N - 1; j >= 0; j--) board[i][j] = queue[k++]; } } else if (d_ret == UP){ for (i = 0; i < N; i++){ k = 0; for (j = 0; j < N; j++) queue[k++] = board[j][i]; queueing(); k = 0; for (j = 0; j < N; j++) board[j][i] = queue[k++]; } } else if (d_ret == DOWN){ for (i = 0; i < N; i++){ k = 0; for (j = N - 1; j >= 0; j--) queue[k++] = board[j][i]; queueing(); k = 0; for (j = N - 1; j >= 0; j--) board[j][i] = queue[k++]; } } } int main(void) { int test_case; int T; int i, j; freopen("input.txt", "r", stdin); setbuf(stdout, NULL); T = 1; scanf("%d", &T); for (test_case = 1; test_case <= T; ++test_case) { scanf("%d %s", &N, dir); for (i = 0; i < N; i++) for (j = 0; j < N; j++) scanf("%d", &board[i][j]); printf("#%d\n", test_case); solve(); print_result(); } return 0; }