문제
체스에서 룩이라는 기물은 막혀있지만 않으면 룩의 위치에서 같은 행, 같은 열에 해당하는 칸 중 하나로 한 번 이동할 수 있다. 단, 특정 칸이 막혀있다면 그 칸에서부터 더 나아갈 수는 없다. 만약 룩이 아래 그림과 같이 5행 4열에 존재하고 같은 행열에 기물이 없다면 5행이나 4열에 존재하는 칸 중 어디로든 갈 수 있다. 예를 들어, 5행 2열 혹은 1행 4열로 움직일 수 있다. 차례에 주어진 이동 횟수는 한 번이므로 이동이 완료되었다면 상대방의 차례로 넘어간다.
체스는 킹만 잡히면 지게 되는 게임이다. 그 중에서도 알랩이는 룩으로 인해 게임을 지는 것을 극도로 싫어한다!
주어진 체스판의 상태에서 현재 차례가 상대의 차례일 때, 이번 차례에 알랩이의 킹이 상대방의 룩에게 잡힐 가능성이 있는지 알아보자.
입력
8줄에 걸쳐 8x8 체스판의 상태가 주어진다. 이때 0은 기물이 없는 상태이고, 1은 알랩이의 킹을 의미하고, 2는 상대의 룩을 의미하며 3은 그 외 다른 기물들을 의미한다. (킹은 하나만 존재하며, 상대의 룩은 최대 2개까지 있을 수 있다. 그 외 기물들은 최대 29개까지 있을 수 있다.)
출력
킹이 룩에게 잡힐 가능성이 있으면 1, 아니면 0을 출력한다.
예제 입력 1
0 3 0 0 0 0 0 0
3 1 0 0 0 0 2 0
0 3 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
예제 출력 1
1
예제 입력 2
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 3 3 0 0 0 0 0
3 0 1 0 3 0 2 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
예제 출력 2
0
#코드
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
|
import java.util.*;
import java.io.*;
public class Main{
public static boolean flag = true;
public boolean isEnemy(int[] dirs, int[] nDirs, int[][] myArr) {
// 기저조건 : 3을 만날 때까지
if(myArr[nDirs[0]][nDirs[1]]==3) {
} else if(myArr[nDirs[0]][nDirs[1]]==2) {
flag = false;
} else {
nDirs[0] = nDirs[0] + dirs[0];
nDirs[1] = nDirs[1] + dirs[1];
isEnemy(dirs, nDirs, myArr);
}
return flag;
}
public static void main(String[] args) throws Exception {
// Please Enter Your Code Here
Main main = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
boolean isSafe = true;
int[][] myArr = new int[10][10]; // 경계값 처리를 위해 2칸씩 더 늘림
for(int i = 0; i < myArr.length; i++) {
for(int j = 0; j < myArr[i].length; j++) {
myArr[i][j] = 3;
}
}
int[] kingPos = new int[2];
for(int i = 1; i <= 8; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 1; j <= 8; j++) {
myArr[i][j] = Integer.parseInt(st.nextToken());
if(myArr[i][j] == 1) {
kingPos[0] = i;
kingPos[1] = j;
}
}
}
// 상, 하, 좌, 우
int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for(int i = 0; i < 4; i++) {
int[] nDirs = new int[2];
nDirs[0] = dirs[i][0] + kingPos[0];
nDirs[1] = dirs[i][1] + kingPos[1];
boolean getRes = main.isEnemy(dirs[i], nDirs, myArr);
if(!getRes) {
isSafe = getRes;
break;
}
}
if(isSafe)
System.out.println(0);
else
System.out.println(1);
}
}
|
cs |
'CS > 알고리즘_문제풀이(자바)' 카테고리의 다른 글
class president (0) | 2021.08.31 |
---|---|
attackrange (0) | 2021.08.30 |
maxofarr (0) | 2021.08.29 |
GCD LCM (0) | 2021.08.28 |
colorpaper (0) | 2021.08.27 |