# 유형 : 시뮬레이션
# 난이도 : 실버 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<=M && 0<newY && newY<=N && !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<=M && 0<newY && newY<=N && 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 |
'백준' 카테고리의 다른 글
#백준_17471 게리맨더링 - Java 자바 (0) | 2020.03.17 |
---|---|
#백준_17281 ⚾ - Java 자바 (0) | 2020.03.16 |
#백준_12761 돌다리 - Java 자바 (0) | 2020.03.11 |
#백준_2986 파스칼 - Java 자바 (0) | 2020.03.11 |
#백준_2194 유닛 이동시키기 - Java 자바 (0) | 2020.03.10 |