BJ 16926回転配列1
41168 ワード
https://www.acmicpc.net/problem/16926 題を読んで、配列ループの構造を理解します. 角入力を変数と配列に格納します.
この回転は、以下の反時計回り方向に、それぞれの円環状の束が並んで形成される.
これを実現するために、各ドーナツをキューに入れた後、回転するたびに頭を尾に接続します.
Qを勉強してから使ったのを覚えていますが、
キューを使用せずにインデックスを並べ替えると、簡単に1つのグリッドを1つにする方法が効率的になります.
この回転は、以下の反時計回り方向に、それぞれの円環状の束が並んで形成される.
これを実現するために、各ドーナツをキューに入れた後、回転するたびに頭を尾に接続します.
Qを勉強してから使ったのを覚えていますが、
キューを使用せずにインデックスを並べ替えると、簡単に1つのグリッドを1つにする方法が効率的になります.
package day0209;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class RotateArray {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
static int[][] map;
static int N, M, R, count = 0, full;
static LinkedList[] LL;
// 연결리스트를 Math.min(N,M) / 2개만큼 만들어 회전할 때, 큐를 이용함.
public static void makeLL(int round, int x, int y, int dir) {
if (count >= ((N - 1 - (2 * round)) + (M - 1 - (2 * round))) * 2) {
round++;
x = round;
y = round;
count = 0;
}
if (round == full)
return;
if (dir == 0) {
if (y + 1 < M - round) {
LL[round].add(map[x][y]);
count++;
makeLL(round, x, y + 1, dir);
return;
} else if (y + 1 >= M - round) {
dir++;
}
} else if (dir == 1) {
if (x + 1 < N - round) {
LL[round].add(map[x][y]);
count++;
makeLL(round, x + 1, y, dir);
return;
} else if (x + 1 >= N - round) {
dir++;
}
} else if (dir == 2) {
if (y - 1 >= 0 + round) {
LL[round].add(map[x][y]);
count++;
makeLL(round, x, y - 1, dir);
return;
} else if (y - 1 < 0 + round) {
dir++;
}
} else if (dir == 3) {
if (x - 1 >= 0 + round) {
LL[round].add(map[x][y]);
count++;
makeLL(round, x - 1, y, dir);
return;
} else if (x - 1 < 0 + round) {
dir -= 3;
}
}
makeLL(round, x, y, dir);
}
static void Rotate() {
for(int i = 0; i < full; i++) {
for(int j = 0; j < R; j++) {
LL[i].offer((LL[i].poll()));
}
}
}
// 회전된 큐를 다시 배열로 돌려놓는 과정.
static void draw(int round, int x, int y, int dir) {
if(LL[round].isEmpty()) {
round++;
x = round;
y = round;
}
if (round == full)
return;
if (dir == 0) {
if (y + 1 < M - round) {
map[x][y] = (int) LL[round].poll();
draw(round, x, y + 1, dir);
return;
} else if (y + 1 >= M - round) {
dir++;
}
} else if (dir == 1) {
if (x + 1 < N - round) {
map[x][y] = (int) LL[round].poll();
draw(round, x + 1, y, dir);
return;
} else if (x + 1 >= N - round) {
dir++;
}
} else if (dir == 2) {
if (y - 1 >= 0 + round) {
map[x][y] = (int) LL[round].poll();
draw(round, x, y - 1, dir);
return;
} else if (y - 1 < 0 + round) {
dir++;
}
} else if (dir == 3) {
if (x - 1 >= 0 + round) {
map[x][y] = (int) LL[round].poll();
draw(round, x - 1, y, dir);
return;
} else if (x - 1 < 0 + round) {
dir -= 3;
}
}
draw(round, x, y, dir);
}
static void print() {
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
map = new int[N][M];
if (N < M) {
full = N / 2;
} else {
full = M / 2;
}
LL = new LinkedList[full];
for (int i = 0; i < full; i++) {
LL[i] = new LinkedList<Integer>();
}
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
makeLL(0,0,0,0);
Rotate();
/* System.out.println(LL[0]);
System.out.println(LL[1]);*/
draw(0,0,0,0);
print();
bw.flush();
bw.close();
}
}
Reference
この問題について(BJ 16926回転配列1), 我々は、より多くの情報をここで見つけました https://velog.io/@mraz0210/BJ16926-배열-돌리기-1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol