BJ 16926回転配列1


https://www.acmicpc.net/problem/16926
  • 題を読んで、配列ループの構造を理解します.
  • 角入力を変数と配列に格納します.

  • この回転は、以下の反時計回り方向に、それぞれの円環状の束が並んで形成される.
    これを実現するために、各ドーナツをキューに入れた後、回転するたびに頭を尾に接続します.
    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();
    	}
    
    }