#pragma warning(disable : 4996)
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int T, N;
int com[21][21];
int tile[21][21];
int tile_col_row[21][21];
//right down left up
int dy[4] = { 0,1,0,-1 }; // row
int dx[4] = { 1,0,-1,0 }; // col
void copy_arr(int dst[][21], int src[][21])
{
for (int i = 0; i < 21; i++)
{
for (int j = 0; j < 21; j++)
dst[i][j] = src[i][j];
}
}
void init(int arr[][21])
{
for (int i = 0; i < 21; i++)
memset(arr[i], 0, sizeof(arr[i]));
}
void Move_up(int ptile[][21])
{
for (int i = 0; i < N; i++) //col
{
int r = 0;
int last_num_idx = 0;
for (int j = 0; j < N - 1; j++) //row
{
if (ptile[j][i] > 0)
{
last_num_idx = j;
if (ptile[j + 1][i] == ptile[j][i] && com[j][i] == 0 && com[j + 1][i] == 0) // check down
{
ptile[j][i] = ptile[j][i] * 2;
ptile[j + 1][i] = 0;
com[j][i] = 1;
}
}
else if (ptile[j][i] == 0)
{
r = j;
while (ptile[r][i] == 0 && r < N - 1)
r++;
if (r == N - 1)
{
ptile[r-1][i] = ptile[r][i];
ptile[r][i] = 0;
break;
}
int k;
for (k = 0; k < N - j - 1; k++)
{
if (r + k >= N)
{
ptile[j + k][i] = 0;
continue;
}
ptile[j + k][i] = ptile[r + k][i];
}
ptile[j + k][i] = 0;
j--;
if (j >= 0 && ptile[j + 1][i] == ptile[j][i] && com[j][i] == 0 && com[j + 1][i] == 0) // check down
{
ptile[j][i] = ptile[j][i] * 2;
ptile[j + 1][i] = 0;
com[j][i] = 1;
}
}
}
}
}
void change_up_down(int ptile[][21])
{
int n_tile[21][21];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
n_tile[i][j] = ptile[N - i - 1][j];
}
copy_arr(ptile, n_tile);
}
void cr_to_t(int srctile[][21], int dsttile[][21]) //change row and col
{
for (int i = 0; i < 21; i++)
{
for (int j = 0; j < 21; j++)
{
dsttile[j][i] = srctile[i][j];
}
}
}
void Move(char dir)
{
if (dir == 'u')
Move_up(tile);
else if (dir == 'd') {
change_up_down(tile);
Move_up(tile);
change_up_down(tile);
}
else if (dir == 'l')
{
Move_up(tile_col_row);
cr_to_t(tile_col_row, tile);
}
else if (dir == 'r')
{
change_up_down(tile_col_row);
Move_up(tile_col_row);
change_up_down(tile_col_row);
cr_to_t(tile_col_row, tile);
}
}
void print_r()
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%d ", tile[i][j]);
}
printf("\n");
}
}
int main()
{
scanf("%d", &T);
for (int i = 0; i < T; i++)
{
init(com);
init(tile);
init(tile_col_row);
N = 0;
char dir[6];
scanf("%d %s", &N, dir);
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
int n;
scanf("%d", &n);
tile[j][k] = n;
tile_col_row[k][j] = n;
}
}
Move(dir[0]);
printf("#%d\n", i+1);
print_r();
}
int s = 0;
return 0;
}
Move_up함수는 타일을 위로 이동시키는 것이다.
1)아래로 이동
기존의 타일을 상하 반전 시켜놓고 위로 이동한 후 다시 상하반전시켰다.
2) 왼쪽으로 이동
기존의 타일의 행열을 바꾼것을 위로 이동한 후 다시 행열을 바꾸었다.
3) 오른쪽으로 이동
기존의 타일의 행열을 바꾼것을 상하반전 시키고 위로 이동한 후 상하반전과 행열 전환을 한번 더 하였다.
728x90
'코테 > SW Expert Academy' 카테고리의 다른 글
sample_input.txt 파일에서 데이터 추출하기 (0) | 2022.07.12 |
---|---|
4014. [모의 SW 역량테스트] 활주로 건설 (0) | 2022.04.30 |
5656. [모의 SW 역량테스트] 벽돌 깨기 (0) | 2022.03.29 |
13475. 동선 추적 (2) | 2022.02.20 |
4408. 자기 방으로 돌아가기 (0) | 2022.02.08 |