-
https://www.acmicpc.net/problem/18428
18428번: 감시 피하기
NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복
www.acmicpc.net
아이디어
완전탐색으로 풀이했습니다.
#include <iostream>#include <vector>using namespace std;int N;vector<vector<char>> arr;vector<pair<int, int>> teacher;bool canAvoid = false;int mx[4] = { 0,0,1,-1 };int my[4] = { 1,-1,0,0 };void input() {cin >> N;arr.resize(N, vector<char>(N));for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {cin >> arr[i][j];if (arr[i][j] == 'T')teacher.push_back({ i,j });}}}//회피할 수 있는지 확인bool avoidMonitor() {for (int i = 0; i < teacher.size(); i++) {for (int j = 0; j < 4; j++) {int y = teacher[i].first;int x = teacher[i].second;while (true) {y += my[j];x += mx[j];//범위를 벗어나면 안됨if (y < 0 || y >= N || x < 0 || x >= N) break;//X이면 다음 공간을 확인 해야함if (arr[y][x] == 'X') continue;//S가 보이면 실패if (arr[y][x] == 'S') return false;//T와 O의 케이스break;}}}return true;}void dfs(int cnt) {//피할 수 있는 경우가 있다면 더 이상 탐색하지 않음if (canAvoid) return;//3개를 모두 설치했을때 확인if (cnt == 3) {canAvoid = avoidMonitor();return;}for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {if (arr[i][j] != 'X') continue;arr[i][j] = 'O';dfs(cnt + 1);arr[i][j] = 'X';if (canAvoid) return;}}}void solution() {//완전 탐색으로 풀이dfs(0);if (canAvoid) cout << "YES";else cout << "NO";}int main(void) {input();solution();}'알고리즘 > 백준' 카테고리의 다른 글
BOJ 1072 게임 / C++ (0) 2022.12.04 BOJ 1939 중량제한 / C++ (0) 2022.12.03 BOJ 2632 피자판매 / C++ (1) 2022.12.03 BOJ 3109 빵집 / C++ (2) 2022.09.15 BOJ 1322 X와 K / C++ (0) 2022.09.15