File tree Expand file tree Collapse file tree 1 file changed +75
-0
lines changed
Expand file tree Collapse file tree 1 file changed +75
-0
lines changed Original file line number Diff line number Diff line change 1+ """
2+ role : 1. T , S , O
3+ T - 상하좌우 like 룩
4+ - 장애물 막히면 뒤에 못봄
5+
6+ 1. T 가 볼 수 있는 영역 -> S 탐색 여부 확인
7+ 2.
8+
9+
10+ """
11+ import sys
12+ def backtracking (cnt ):
13+ global flag
14+
15+ # 3개 장애믈 설치 끝나면
16+ if cnt == 3 :
17+ # 선생님들 위치에서 감시
18+ if check_S ():
19+ flag = True # 성공하면 flag를 True로 초기화
20+ return True
21+ else : # 모든 빈 공간에 장애물 3개씩 설치해보기
22+ for x in range (n ):
23+ for y in range (n ) :
24+ if graph [x ][y ] == "X" :
25+ graph [x ][y ] = "O"
26+ backtracking (cnt + 1 ) # backtraking
27+ graph [x ][y ] = "X"
28+
29+
30+ def check_S () :
31+ #check_S : 선생님 시야 함수 (bfs -> 근데 dfs에 가깝지 않나???)
32+ #check = True # T가 S 를 못 찾음
33+
34+ # 상하좌우 움직이는 배열
35+ dx = [1 ,- 1 ,0 ,0 ]
36+ dy = [0 ,0 ,1 ,- 1 ]
37+
38+ for t in teachers : # 선생님 위치에서
39+
40+ for k in range (4 ): #상하좌우 탐색
41+ nx = t [0 ] + dx [k ]
42+ ny = t [1 ] + dy [k ]
43+ # 선생님 x,y 좌표
44+ while 0 <= nx < n and 0 <= ny < n : # graph 범위 밖 넘어가는 것 차단
45+ if graph [nx ][ny ] == "O" : #방애물 있으면 해당 방향 스킵
46+ break
47+ if graph [nx ][ny ] == "S" : # S 가 있으면 실패
48+ return False
49+ nx += dx [k ]
50+ ny += dy [k ]
51+
52+ # 모두 통과하면 S가 안보이는 것으로 성공
53+ return True
54+
55+
56+ # input 받기 - graph , T 위치 , X 위치
57+ n = int (sys .stdin .readline ())
58+ flag = False # (답) 전체 시야 차단 yes or no
59+ graph = [] # 전체 MAP 위치
60+ teachers = list () # 선생님 (T) 좌표
61+
62+ for i in range (n ):
63+ graph .append (list (map (str , sys .stdin .readline ().split ())))
64+ for j in range (n ):
65+ if graph [i ][j ] == "T" : # 선생님 있는 좌표 저장
66+ teachers .append ([i ,j ])
67+
68+
69+ # BFS
70+ backtracking (0 )
71+
72+ if flag :
73+ print ("YES" )
74+ else :
75+ print ("NO" )
You can’t perform that action at this time.
0 commit comments