-
Notifications
You must be signed in to change notification settings - Fork 845
/
6.cpp
128 lines (119 loc) · 3.76 KB
/
6.cpp
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <bits/stdc++.h>
using namespace std;
int n; // 복도의 크기
char board[6][6]; // 복도 정보 (N x N)
vector<pair<int, int> > teachers; // 모든 선생님 위치 정보
vector<pair<int, int> > spaces; // 모든 빈 공간 위치 정보
// 특정 방향으로 감시를 진행 (학생 발견: true, 학생 미발견: false)
bool watch(int x, int y, int direction) {
// 왼쪽 방향으로 감시
if (direction == 0) {
while (y >= 0) {
if (board[x][y] == 'S') { // 학생이 있는 경우
return true;
}
if (board[x][y] == 'O') { // 장애물이 있는 경우
return false;
}
y -= 1;
}
}
// 오른쪽 방향으로 감시
if (direction == 1) {
while (y < n) {
if (board[x][y] == 'S') { // 학생이 있는 경우
return true;
}
if (board[x][y] == 'O') { // 장애물이 있는 경우
return false;
}
y += 1;
}
}
// 위쪽 방향으로 감시
if (direction == 2) {
while (x >= 0) {
if (board[x][y] == 'S') { // 학생이 있는 경우
return true;
}
if (board[x][y] == 'O') { // 장애물이 있는 경우
return false;
}
x -= 1;
}
}
// 아래쪽 방향으로 감시
if (direction == 3) {
while (x < n) {
if (board[x][y] == 'S') { // 학생이 있는 경우
return true;
}
if (board[x][y] == 'O') { // 장애물이 있는 경우
return false;
}
x += 1;
}
}
return false;
}
// 장애물 설치 이후에, 한 명이라도 학생이 감지되는지 검사
bool process() {
// 모든 선생의 위치를 하나씩 확인
for (int i = 0; i < teachers.size(); i++) {
int x = teachers[i].first;
int y = teachers[i].second;
// 4가지 방향으로 학생을 감지할 수 있는지 확인
for (int i = 0; i < 4; i++) {
if (watch(x, y, i)) {
return true;
}
}
}
return false;
}
bool found; // 학생이 한 명도 감지되지 않도록 설치할 수 있는지의 여부
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> board[i][j];
// 선생님이 존재하는 위치 저장
if (board[i][j] == 'T') {
teachers.push_back({i, j});
}
// 장애물을 설치할 수 있는 (빈 공간) 위치 저장
if (board[i][j] == 'X') {
spaces.push_back({i, j});
}
}
}
// 빈 공간에서 3개를 뽑는 모든 조합을 확인
vector<bool> binary(spaces.size());
fill(binary.end() - 3, binary.end(), true);
do {
// 장애물들을 설치해보기
for (int i = 0; i < spaces.size(); i++) {
if (binary[i]) {
int x = spaces[i].first;
int y = spaces[i].second;
board[x][y] = 'O';
}
}
// 학생이 한 명도 감지되지 않는 경우
if (!process()) {
// 원하는 경우를 발견한 것임
found = true;
break;
}
// 설치된 장애물을 다시 없애기
for (int i = 0; i < spaces.size(); i++) {
if (binary[i]) {
int x = spaces[i].first;
int y = spaces[i].second;
board[x][y] = 'X';
}
}
} while(next_permutation(binary.begin(), binary.end()));
if (found) cout << "YES" << '\n';
else cout << "NO" << '\n';
}