[白俊]16927号回転配列2解JAVA
21510 ワード
問題のショートカット
私の答え
私の答え
表現問題なので、解答がとても複雑です.解が終わったら、他の人の解を見て、私と同じように複雑に解けたようです.
問題のポイントは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());
}
}
}
Reference
この問題について([白俊]16927号回転配列2解JAVA), 我々は、より多くの情報をここで見つけました
https://velog.io/@hahahaa8642/백준-16927번-배열-돌리기2-JAVA-풀이
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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());
}
}
}
Reference
この問題について([白俊]16927号回転配列2解JAVA), 我々は、より多くの情報をここで見つけました https://velog.io/@hahahaa8642/백준-16927번-배열-돌리기2-JAVA-풀이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol