[ABC 458] B. Count Adjacent Cells
  • 실행 시간 제한: 2초 / 메모리 제한: 1024 MiB
  • 배점: 200점

문제


HHWW열의 격자가 존재한다. 위에서 ii번째 행, 왼쪽에서 jj번째 열의 칸을 칸 (i,j)(i,j)라고 한다. 칸 (x1,y1)(x_1,y_1)와 칸 (x2,y2)(x_2,y_2)변이 인접한다고 함은, x1x2+y1y2=1|x_1-x_2|+|y_1-y_2|=1이 성립함을 말한다. 모든 칸에 대하여 그 칸과 변이 인접하는 칸의 개수를 구하시오.

제약


  • 1H,W501\leq H,W\leq50
  • 입력되는 값은 모두 정수

입력


입력은 아래의 형식으로 표준입력을 통해 주어진다.

HH WW

출력


답을 아래의 형식으로 출력하라.

x1,1x_{1,1}x1,2x_{1,2}\cdots x1,Wx_{1,W} x2,1x_{2,1}x2,2x_{2,2}\cdots x2,Wx_{2,W} \vdots xH,1x_{H,1}xH,2x_{H,2}\cdots xH,Wx_{H,W}

이때, xi,jx_{i,j}는 칸 (i,j)(i,j)와 변이 인접하는 칸의 개수를 나타낸다.

입력 예제 1


4 5

출력 예제 1


2 3 3 3 2
3 4 4 4 3
3 4 4 4 3
2 3 3 3 2

(1,5)(1,5)와 변이 인접하는 칸은 칸 (1,4),(2,5)(1,4),(2,5)22개이다. 칸 (2,3)(2,3)와 변이 인접하는 칸은 칸 (1,3),(2,2),(2,4),(3,3)(1,3),(2,2),(2,4),(3,3)44개이다. 칸 (4,2)(4,2)와 변이 인접하는 칸은 칸 (3,2),(4,1),(4,3)(3,2),(4,1),(4,3)33개이다.

해설


  • (i,j)(i,j)와 변이 인접하는 칸은 아래의 4가지이다.
    • 上: 칸 (i1,j)(i-1,j)
    • 下: 칸 (i+1,j)(i+1,j)
    • 左: 칸 (i,j1)(i,j-1)
    • 右: 칸 (i,j+1)(i,j+1)
  • 따라서 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();
		}
	}
}