https://www.acmicpc.net/problem/1913
배열 회전 순서에 따라서 dir
만 순서에 맞게 구현해주면 된다.
규칙이 있을거라고 생각해서 rowIdx
랑 colIdx
만 계속 증가 감소 규칙대로 구현했는데,
생각해보니까 그냥 DFS/BFS 푸는 방식대로 똑같이 구현해도 크게 쉽게 풀 수 있는 문제였다.
import java.io.*;
public class Main {
// input
private static BufferedReader br;
// variables
private static int N, M;
private static int[][] arr;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
input();
bw.write(solve());
bw.close();
} // End of main()
private static String solve() {
StringBuilder sb = new StringBuilder();
int x = 0;
int y = 0;
int num = N * N;
int[] dirX = {1, 0, -1, 0};
int[] dirY = {0, 1, 0, -1};
int nowDir = 0;
int targetX = 0;
int targetY = 0;
while (num > 0) {
arr[x][y] = num;
if (num == M) {
targetX = x + 1;
targetY = y + 1;
}
int nextX = x + dirX[nowDir];
int nextY = y + dirY[nowDir];
if (!isAbleCheck(nextX, nextY)) {
nowDir = (nowDir + 1) % 4;
nextX = x + dirX[nowDir];
nextY = y + dirY[nowDir];
}
x = nextX;
y = nextY;
num--;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(arr[i][j]).append(' ');
}
sb.append('\n');
}
sb.append(targetX).append(' ').append(targetY);
return sb.toString();
} // End of solve()
private static boolean isAbleCheck(int nextX, int nextY) {
return nextX >= 0 && nextX < N && nextY >= 0 && nextY < N && arr[nextX][nextY] == 0;
} // End of isAbleCheck()
private static void input() throws IOException {
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
arr = new int[N][N];
} // End of input()
} // End of Main class