[ABC 458] B. Count Adjacent Cells
- 실행 시간 제한: 2초 / 메모리 제한: 1024 MiB
- 배점: 200점
문제
행 열의 격자가 존재한다. 위에서 번째 행, 왼쪽에서 번째 열의 칸을 칸 라고 한다. 칸 와 칸 의 변이 인접한다고 함은, 이 성립함을 말한다. 모든 칸에 대하여 그 칸과 변이 인접하는 칸의 개수를 구하시오.
제약
- 입력되는 값은 모두 정수
입력
입력은 아래의 형식으로 표준입력을 통해 주어진다.
출력
답을 아래의 형식으로 출력하라.
이때, 는 칸 와 변이 인접하는 칸의 개수를 나타낸다.
입력 예제 1
4 5
출력 예제 1
2 3 3 3 2
3 4 4 4 3
3 4 4 4 3
2 3 3 3 2
칸 와 변이 인접하는 칸은 칸 의 개이다. 칸 와 변이 인접하는 칸은 칸 의 개이다. 칸 와 변이 인접하는 칸은 칸 의 개이다.
해설
- 칸 와 변이 인접하는 칸은 아래의 4가지이다.
- 上: 칸
- 下: 칸
- 左: 칸
- 右: 칸
- 따라서 4방향으로 델타 탐색을 수행하여 변이 인접하는 칸의 개수를 구한다.
코드
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));
int[] di = {-1, 1, 0, 0}; // 上、下、左、右
int[] dj = { 0, 0, -1, 1};
StringTokenizer st = new StringTokenizer(br.readLine());
int h = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
int[][] map = new int[h][w];
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
for (int k = 0; k < 4; ++k) {
int ni = i+di[k], nj = j+dj[k];
if (0 <= ni && ni < h && 0 <= nj && nj < w ) map[ni][nj]++;
}
}
}
for (int[] is : map) {
for (int i : is)
System.out.print(i+" ");
System.out.println();
}
}
}