import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class TornadoPrint {
static int[] dr = {0,-1,0,1};
static int[] dc = {1,0,-1,0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int r1 = Integer.parseInt(st.nextToken());
int c1 = Integer.parseInt(st.nextToken());
int r2 = Integer.parseInt(st.nextToken());
int c2 = Integer.parseInt(st.nextToken());
int[][] map = new int[50][5];
int row = 10001/2;
int col = 10001/2;
int count = 2;
int dir = 0;
if(r1<=0&&r2>=0&&c1<=0&&c2>=0){
map[row-(10001/2+r1)][col-(10001/2+c1)] = 1;
}
int dircnt = 1;
int cnt = 1;
while (true){
if(count==100020002) break;
for (int i = 0; i < cnt; i++) {
if(count==100020002) break;
row += dr[dir%4];
col += dc[dir%4];
if(row>=10001/2+r1&&row<=10001/2+r2&&col>=10001/2+c1&&col<=10001/2+c2){
map[row-(10001/2+r1)][col-(10001/2+c1)] = count;
}
count++;
}
if(dircnt%2==0) cnt++;
dir++;
dircnt++;
}
int max = 0;
for (int i = 0; i <= r2-r1; i++) {
for (int j = 0; j <= c2-c1; j++) {
StringBuilder sb = new StringBuilder();
sb.append(map[i][j]);
max = Math.max(sb.length(),max);
}
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i <= r2-r1; i++) {
for (int j = 0; j <= c2-c1; j++) {
StringBuilder sb = new StringBuilder();
sb.append(map[i][j]);
for (int k = 0; k < max-sb.length(); k++) {
stringBuilder.append(" ");
}
stringBuilder.append(map[i][j]).append(" ");
}
if(i==r2-r1)break;
stringBuilder.append("\n");
}
System.out.println(stringBuilder);
}
}
-5 000 ≤ r1, c1, r2, c2 ≤ 5,000
0 ≤ r2 - r1 ≤ 49
0 ≤ c2 - c1 ≤ 4
만약 수의 길이가 가장 길이가 긴 수보다 작다면, 왼쪽에서부터 공백을 삽입해 길이를 맞춘다.
📢해당풀이의 전체적인 접근은, 입력값의 최대범위에 맞게 배열을 생성한다고 가정하고, 안에 소용돌이 형태로 수를 넣는것이다.
단, 이때 실제로 최대범위로 배열을 생성해버리면 메모리초과가 발생하므로, 출력하는 범위에 맞게 배열을 생성하고, 출력범위에 해당할 때에만 수를 넣는다.
소용돌이 형태의 map을 만드는 방법은 여러가지가 있는데, 여러가지의 방법을 알고 있었어서 조건에 맞는 방법을 골라 쓸 수 있었다고 생각한다.
처음에 생각한 방법으로는 가상의 배열이라는 조건에 맞출수 없어서,
해당 조건에 맞게 규칙을 찾아 다시 설계하였다.
행과 열이 기본형태로 나오는게 아니라 중앙에서부터 0,0이어서 범위를 조건에 맞게 설정하는것이 까다로운 문제였다.