public class Snail {
static int[] dx = {0, 1, 0, -1}; //좌하우상
static int[] dy = {-1, 0, 1, 0};
static int[][] map = new int[5][5];
public static void main(String[] args) {
int cnt = 25;
int x = 0, y = 4;
int dir = 0; //방향 변수
while (cnt >= 1) {
//현재 좌표부터 넣어준다.
map[x][y] = cnt--;
//NowX,nowY는 판단하는 변수이지 현재 좌표가 여기서는 아니다.
int nowX = x + dx[dir];
int nowY = y + dy[dir];
//다음 좌표가 유효한지 체크하고 유효하지 않다면 nowX,nowY를 유효하게 바꾸고 x,y에 넣어준다.
if (nowX < 0 || nowY < 0 || nowX >= 5 || nowY >= 5 || map[nowX][nowY] != 0) { //벽을 만나거나 지도의 숫자가 0이 아닌 다른 수로 채워져있을 경우
dir = (dir + 1) % 4;//0,1,2,3 순서로 바꾼다.
//nowX는 기존 좌표에서 다음 좌표의 이동 좌표를 판단하는 기준이 되는 좌표이다.
//x,y가 0이 되면 nowX=0,nowY=-1 상태로 되어있다.
//nowY가 -1이므로 if 문으로 들어오게 되고 dir = 1로 바뀐다.
//그 이후에 좌표값의 아무런 변동없이 if문을 탈출하면 cnt--; 와 map[nowX][nowY]가 실행되므로
//map[0][-1] 이 나와 배열 인덱스 범위를 벗어나게 된다.
//따라서 nowX와 nowY를 (0,-1)에서 값을 변경시켜야 한다.
//기존 값 (0,0)에서 방향을 바꾼 좌표를 nowX,nowY에 넣어준다.
//(0+1,0) 해서 아래로 내려가는 좌표가 대입된다.
nowX = x + dx[dir]; //1
nowY = y + dy[dir]; //0
}
x = nowX; //위에보면 x에 방향을 더하고 있다. 따라서 x에 이동할 때마다 좌표값을 업데이트 해주어야 한다.
y = nowY;
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.printf("%5d", map[i][j]);
}
System.out.println();
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int test = Integer.parseInt(br.readLine());
for (int i = 0; i < test; i++) {
int max = 0;
int N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
int[][] map = new int[N][N];
int num = Integer.parseInt(st.nextToken());
int[] power = new int[num];
for (int j = 0; j < num; j++) {
power[j] = Integer.parseInt(st.nextToken());
}
int[] dx = {-1, 1, 0, 0, 1, -1, 1, -1};
int[] dy = {0, 0, 1, -1, 1, -1, -1, 1};
st = new StringTokenizer(br.readLine());
for (int j = 0; j < num; j++) {
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
for (int d = 0; d < 4; d++) { //한 방향에서 power 의 크기만큼 파장이 생겨야 한다.
for (int p = 0; p < power[j]; p++) { //power 크기만큼 값 입력을 반복해준다.
int nowX = x + dx[d];
int nowY = y + dy[d];
if (nowX < 0 || nowY < 0 || nowX >= N || nowY >= N) continue;
map[nowX][nowY]++;
x = nowX;
y = nowY;
max = Math.max(map[nowX][nowY], max);
}
}
}
System.out.println("#" + test + " " + max);
}
}
}
//3
//6
//3 3 2 2
//2 3 1 2 5 2
//6
//3 3 1 1
//1 1 2 2 6 6
//5
//4 3 2 2 1
//2 3 1 2 5 2 3 3
[참외밭]
https://www.acmicpc.net/problem/2477