코딩테스트

BFS&DFS_심화20) 감시 피하기 _ python

728x90

문제링크

https://www.acmicpc.net/problem/18428

 

18428번: 감시 피하기

NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복

www.acmicpc.net

코드

# 감시 피하기
from itertools import combinations
from collections import deque
import copy

n = int(input())
maps = []
for i in range(n):
    maps.append(list(input().split()))
# 선생님, 학생, 빈칸 좌표 저장
tch = []
empty = []
for x in range(n):
    for y in range(n):
        if maps[x][y] == 'T': tch.append((x, y))
        elif maps[x][y] == 'X': empty.append((x, y))

def bfs(map):
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]
    for t in tch:
        for k in range(4):
            nx, ny = t
            while 0 <= nx < n and 0 <= ny < n:
                if map[nx][ny] == 'O':
                    break
                if map[nx][ny] == 'S':
                    return False
                nx += dx[k]
                ny += dy[k]
    return True

def solution():
    for i in combinations(empty, 3) :
        new_maps = copy.deepcopy(maps)
        for x, y in i:
            new_maps[x][y] = 'O'
        if bfs(new_maps):
            return 'YES'
    return 'NO'
print(solution())

 

728x90