[白俊]16927号回転配列2解JAVA


問題のショートカット

私の答え


表現問題なので、解答がとても複雑です.解が終わったら、他の人の解を見て、私と同じように複雑に解けたようです.
問題のポイントは1ターンごとにタイムアウトするので、rは一度に返すべきです.
私が絵を描いていると、n,mがどのように与えられても、いつも皮の一番左上隅が(index, index)であることがわかりました.
したがって左上隅から同じハウジング内の要素を巡回してlistに入れ、さらに一周して기존의 list index + 회전 횟수をインデックスとするlist値をarrに入れる.
また、boolean[][] visitedによって回転した筐体にアクセスマークが付けられていることは、(index, index)が既にアクセスしていれば全ての筐体の回転が終了することを意味する.

マイコード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

class Main {

	static int[][] arr;
	static boolean[][] visited;

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		int r = Integer.parseInt(st.nextToken());

		arr = new int[n][m];
		visited = new boolean[n][m];

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < m; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		int index = 0;
		while (!visited[index][index]) {
			rotate(index, n - index, m - index, r);
			index++;
		}

		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				sb.append(arr[i][j]).append(" ");
			}
			sb.append("\n");
		}

		System.out.println(sb);
	}

	private static void rotate(int index, int row, int col, int count) {
		List<Integer> list = new ArrayList<>();
		int x = index;
		int y = index;
		while (y < col - 1) {
			list.add(arr[x][y++]);
		}
		while (x < row - 1) {
			list.add(arr[x++][y]);
		}
		while (y > index) {
			list.add(arr[x][y--]);
		}
		while (x > index) {
			list.add(arr[x--][y]);
		}
		while (y < col - 1) {
			visited[x][y] = true;
			arr[x][y++] = list.get(count++ % list.size());
		}
		while (x < row - 1) {
			visited[x][y] = true;
			arr[x++][y] = list.get(count++ % list.size());
		}
		while (y > index) {
			visited[x][y] = true;
			arr[x][y--] = list.get(count++ % list.size());
		}
		while (x > index) {
			visited[x][y] = true;
			arr[x--][y] = list.get(count++ % list.size());
		}
	}
}