Closed yeahdy closed 4 days ago
Level에 따라 화전하는 정도가 달라지나, 규칙은 동일함 (2L * 2L
만큼 선택하여 2L−1 * 2L−1
만큼 잘라 4등분하여 회전)
void rotate(int level)
level
에 따라서 회전을 하는 함수int[][] tmp
: map
의 1사분면 부분을 저장하는 변수copyPart1(r, c, size / 2)
을 통해 map
에서 1사분면을 저장함void rotate(int r, int c, int dir, int level, int[][] tmp)
r
, c
: 배열에서 회전을 시작하는 지점rr
, cc
: 첨부한 사진에서 민트색 부분 배열1 * 1
이기 때문에 표시하지 않음void checkMapStatus()
bfs
를 통해 map
의 상태를 확인하며 얼음이 있는 영역의 최대 크기와 남아있는 얼음의 양 구하기
빙하 회전 → 빙하 녹음
을 반복 rotate()
: 빙하의 회전을 구현
2^level
의 덩어리들 속에서 빙하의 움직임이 이루어짐move()
: 각 꼭짓점을 기준으로 다음 위치로 이동
for (int i = 0; i < m; i += M) {
for (int j = 0; j < m; j += M) {
// 각 꼭짓점을 기준으로 덩어리들이 움직임
move(i, j, N, 0);
move(i, j + N, N, 1);
move(i + N, j, N, 2);
move(i + N, j + N, N, 3);
}
}
BFS
다혜님이 그림으로 너무 잘 표현해주셨네요
1) 격자 회전
2) 빙하 회전
빙하 회전
기존 90도 회전에서, 각 서브 사각형(분할된 배열)이 회전하는 형태로 업데이트
private static void rotateIce(int sx, int sy, int l, int[][] tmp) { // 레벨 사각형안의 분할된 사각형의 회전
int s = 1<<l;
int ss = 1 << (l - 1);
for (int i = sx; i < sx + s; i+=ss) { // 현재 레벨 사각형의 시작 꼭짓점부터 진행
for (int j = sy; j < sy + s; j+=ss) {
int ox = i - sx; // 0점 맞추기
int oy = j - sy;
int rx = oy; // 회전 좌표
int ry = s-ox-ss;
for (int x = 0; x < ss; x++) { // 분할된 사각형 조각 이동
for (int y = 0; y < ss; y++) {
int cx = i + x; // 원본 배열에서 현재 위치
int cy = j + y;
int nx = rx + x; // 회전된 좌표에서 새로운 위치
int ny = ry + y;
tmp[nx+sx][ny+sy] = board[cx][cy]; // 회전된 위치엔 보정으로 뺐던 시작값 더해주기
}
}
}
}
}
ry좌표
: 분할된 사각형 크기만큼의 조정이 필요x,y for문
: 회전한 위치로 분할된 사각형 이동=> bfs 탐색: O(N* N)이므로 완전탐색 가능 => 시뮬레이션 가능
public static void rotate(int S, int sx, int sy) {
int ts = S / 2;
for(int x=sx; x<sx+S; x+=ts) {
for(int y=sy; y<sy+S; y+=ts) {
int ox = x - sx; // 원점 이동
int oy = y - sy;
int nx = oy; // 시계방향 회전
int ny = S - ts - ox;
t[nx+sx][ny+sy] = g[x][y]; // 회전된 새로운 시작점 위치
int tx = (nx+sx)-x; // 새로운 시작점 위치의 이동 벡터 구하기
int ty = (ny+sy)-y;
// 내부 사각형 원소들 새로운 시작점 기준으로 덩어리 이동
for(int i=x; i<x+ts; i++) {
for(int j=y; j<y+ts; j++) {
t[i+tx][j+ty] = g[i][j];
}
}
}
}
}
2 ≤ n ≤ 6
n*n = 36 1 ≤ q ≤ 1,000
문제의 요구사항에 따라 완전탐색 가능얼음 회전하기
임시 배열
생성2^L−1* 2^L−1
만큼 4등분임시 배열 > 원본 배열로 복사
얼음 녹이기 상하좌우 완전탐색을 통해 3개 미만일 경우 얼음 녹이기
얼음 군집 계산하기 BFS 탐색을 통해 이어진 얼음 군집의 최대치 계산하기
얼음 군집을 BFS 로 방향 탐색할 때
1개는 군집으로 포함되지 않는 부분현재 위치에 대한 얼음의 크기와 방문처리 조건문 처리를 제대로 못해서 헤맸네요...