Closed devLupin closed 7 months ago
(0, 0)
으로 현재 좌표를 옮겨준다.(0, 0)
기준으로 얼만큼 떨어졌는지 계산한다.void RotateRange(int sx, int sy, int sz) { // 시작점, 크기
for(int x = sx; x < sx + sz; x++) {
for(int y = sy; y < sy + sz; y++) {
int nx = y - sy;
int ny = sz - (x - sx) - 1;
next_board[nx + sx][ny + sy] = board[x][y];
}
}
}
끝에 도달하면 반대 방향으로 이동하는 경우
(0, 0)
~ (N-1, M-1)
이동은 반복되므로 나머지 연산 적용
distance %= 2 * (N -1)
pii right(int x, int y, int d) {
int dist=d%(2*(m-1));
if(m-y-1<dist) {
dist-=m-y-1;
if(m-1<dist) {
dist-=m-1;
y=dist;
}
else y=m-1-dist;
}
else y+=dist;
return {x,y};
}
pii left(int x, int y, int d) {
int dist=d%(2*(m-1));
if(y<dist) {
dist-=y;
if(m-1<dist) {
dist-=m-1;
y=m-1-dist;
}
else y=dist;
}
else y-=dist;
return {x,y};
}
pii up(int x, int y, int d) {
int dist=d%(2*(n-1));
if(x<dist) {
dist-=x;
if(n-1<dist) {
dist-=n-1;
x=n-1-dist;
}
else x=dist;
}
else x-=dist;
return {x,y};
}
pii down(int x, int y, int d) {
int dist=d%(2*(n-1));
if(n-x-1<dist) {
dist-=n-x-1;
if(n-1<dist) {
dist-=n-1;
x=dist;
}
else x=n-1-dist;
}
else x+=dist;
return {x,y};
}
p
칸 이동하는데 벽이 반대 방향으로 연결되어 있을 때
* p
를 제거해줘야 한다.p
: 이동하려는 칸의 개수
d
: 이동하려는 방향
N
: 배열의 크기
int nx = (x + dx[d] * p + N * p) % N;
int ny = (y + dy[d] * p + N * p) % N;