X Tutup
#include using namespace std; int n; // 복도의 크기 char board[6][6]; // 복도 정보 (N x N) vector > teachers; // 모든 선생님 위치 정보 vector > 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 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'; }
X Tutup