import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt() - 1; // 행렬 크기
int y = sc.nextInt() - 1; // 행크기
int x = sc.nextInt() - 1; // 열 크기
int length = sc.nextInt(); // 범위
int ax, bx, cx, dx;
int ay, by, cy, dy;
int aax, bbx, ccx, ddx;
int aay, bby, ccy, ddy;
int count = 1;
int[][] ary = new int[n + 1][n + 1];
ary[y][x] = 1000;
for (int i = 1; i <= length; i++) {
ax = x + i;
ay = y;
bx = x;
by = y - i;
cx = x - i;
cy = y;
dx = x;
dy = y + i;
if (ax <= n) { // 3시 방향 i출력
ary[ay][ax] = i;
}
if (by >= 0) { // 12시 방향 i출력
ary[by][bx] = i;
}
if (cx >= 0) { // 9시 방향 i출력
ary[cy][cx] = i;
}
if (dy <= n) { // 6시 방향 i출력
ary[dy][dx] = i;
}
aax = ax;
aay = ay; // 1사분면에서 사거리를 표시하기위한 변수
bbx = bx;
bby = by; // 2사분면에서 사거리를 표시하기위한 변수
ccx = cx;
ccy = cy; // 3사분면에서 사거리를 표시하기위한 변수
ddx = dx;
ddy = dy; // 4사분면에서 사거리를 표시하기위한 변수
count = 1;
for (int z = 0; z < i - 1; z++) {
if (aax - count <= n && aay - count >= 0) { // 1사분면
ary[aay - count][aax - count] = i;
}
if (bbx - count >= 0 && by + count >= 0) { // 2사분면
ary[bby + count][bbx - count] = i;
}
if (ccx + count >= 0 && ccy + count <= n) { // 3 사분면
ary[ccy + count][ccx + count] = i;
}
if (ddx + count <= n && ddy - count <= n) { // 4 사분면
ary[ddy - count][ddx + count] = i;
}
count++;
}
}
for (int s = 0; s < n + 1; s++) {
for (int t = 0; t < n + 1; t++) {
if (ary[s][t] == 1000) {
System.out.print("x ");
} else {
System.out.print(ary[s][t] + " ");
}
}
System.out.println("");
}
}
}
이 문제는 행렬에서 미사일의 위치와 사거리가 주어졌을 때, 미사일의 사거리 범위를 표시해주는 문제이다. 미사일의 사거리는 1~n까지 출력되며 각각의 사거리에 1,2,3,4,,,n이 출력된다. 행렬에서 각 사거리의 범위를 이어보면 마름모 모양을 가진다.
아이디어는 먼저, 3,12,9,6시 방향의 사거리를 표시해준다(행렬을 벗어나지 않는 선에서) 이후 1사분면, 2사분면, 3사분면, 4사분면에 앞서 표시한 부분은 제외하고 사거리를 표시해준다. 이때 사거리를 표시해주는 진행방향은 3시부터 반시계 방향으로 표시해준다.
여기서 aax~ddy라는 변수를 사용했는데, 이는 aax는 1사분면의 x값, aay는 1사분면의 y값~~~ddy까지 초기화 해주었다. 이는 각 사분면에서 for문을 사용하여 사거리를 표시해줄 떄 사용한다. aax~ddy라는 변수는 시작점을 초기화 할떄만 변하며 그 이후에는 변하지 않는다. 단지 조건검사를 통해서 행렬을 벗어나지 않는 경우에만 사거리를 표시해주는데 사용된다.
'알고리즘 문제' 카테고리의 다른 글
[알고리즘 문제] Fraction Sum (0) | 2019.04.08 |
---|---|
[알고리즘 문제] (0) | 2019.04.08 |
[알고리즘 문제] Prosjek (0) | 2019.04.06 |
[알고리즌 문제] BeeHive (0) | 2019.04.06 |
[알고리즘 문제] Seat (0) | 2019.04.04 |