# 유형 : 시뮬레이션

# 난이도 : 실버 1

# 나이트, 퀸의 움직임을 반복문을 통해 체크해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package bj;
 
import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class p1986 {
    static int KnightMoveX[] = {1,2,2,1,-1,-2,-2,-1};
    static int KnightMoveY[] = {-2,-1,1,2,2,1,-1,-2};
    static int QueenMoveX[] = {0,1,1,1,0,-1,-1,-1};
    static int QueenMoveY[] = {-1,-1,0,1,1,1,0,-1};
    static int N,M;
    static int Queen,Knight,Pawn;
    static Point[] queen,knight,pawn;
    static boolean visit[][];
    static int arr[][];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        첫째 줄에는 체스 판의 크기 n과 m이 주어진다. (1<=n, m<=1000) 그리고 둘째 줄에는 Queen의 개수와 그 개수만큼의 Queen의 위치가 입력된다. 그리고 마찬가지로 셋째 줄에는
//        Knight의 개수와 위치, 넷째 줄에는 Pawn의 개수와 위치가 입력된다. (즉 둘째 줄~ 넷째 줄은  k,r1,c1,r2,c2,...,rk,ck 이 빈칸을 사이에 두고 주어진다는 것이다.
//        4 4
//        2 1 4 2 4
//        1 1 2
//        1 2 3
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        visit = new boolean[N+1][M+1];
        arr = new int[N+1][M+1];
        st = new StringTokenizer(br.readLine());
        Queen = Integer.parseInt(st.nextToken());
        queen = new Point[Queen];
        for(int i=0; i<Queen; i++) {
            int y = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            queen[i] = new Point(x,y);
            visit[y][x] = true;
            arr[y][x] = 1;
        }
        st = new StringTokenizer(br.readLine());
        Knight = Integer.parseInt(st.nextToken());
        knight = new Point[Knight];
        for(int i=0; i<Knight; i++) {
            int y = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            knight[i] = new Point(x,y);
            visit[y][x] = true;
            arr[y][x] = 1;
        }
        st = new StringTokenizer(br.readLine());
        Pawn = Integer.parseInt(st.nextToken());
        pawn = new Point[Pawn];
        for(int i=0; i<Pawn; i++) {
            int y = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            pawn[i] = new Point(x,y);
            visit[y][x] = true;
            arr[y][x] = 1;
        }
        
        for(int i=0; i<Knight; i++) {
            for(int d=0; d<8; d++) {
                int newX = knight[i].x + KnightMoveX[d];
                int newY = knight[i].y + KnightMoveY[d];
                if(0<newX && newX<=&& 0<newY && newY<=&& !visit[newY][newX])
                    visit[newY][newX] = true;
            }
        }
        for(int i=0; i<Queen; i++) {
            for(int d=0; d<8; d++) {
                int newX = queen[i].x + QueenMoveX[d];
                int newY = queen[i].y + QueenMoveY[d];
                while(true) {
                    if(0<newX && newX<=&& 0<newY && newY<=&& arr[newY][newX] != 1) {
                        visit[newY][newX] = true;
                        newX += QueenMoveX[d];
                        newY += QueenMoveY[d];
                    }else
                        break;
                }
            }
        }
        int result = 0;
        for(int i=1; i<=N; i++
            for(int j=1; j<=M; j++
                if(!visit[i][j])
                    result++;
        
        System.out.println(result);
    }
}
 
cs

+ Recent posts